<h2>The Anchor, With $friend.name</h2>
<<set _settle = [
"Marie sets two pints down without being asked, the way she does for the regulars, and $friend.name slides one across to you. The first one goes down mostly in silence, the comfortable kind. By the second, the talk has found its own way in.",
"$friend.name gets the round before you can reach for your wallet, waving you off like the gesture offends him. You take the stools at the quiet end, away from the jukebox, and settle in. It isn't long before the conversation is going on its own.",
"You carry the pints over and $friend.name shifts his coat off the spare stool to make room. The bar is warm and low-lit and in no hurry, and neither are you. A few mouthfuls in, the easy back-and-forth starts up the way it always has."
]>>
<<= _settle.random()>>
<br><br>
<<switch $friend.topic>>
<<case "old">>
<<speech "You" $name>>
You remember freshman year? Splitting one pitcher four ways because that's all anyone had, and still strutting around like we owned the whole town.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Four guys, one warm pitcher, and we felt like the kings of college. I've got more in the bank now than I know what to do with, and I swear I have never felt as rich as I did broke on that porch. You think we'll ever feel freedom like that again?
<</speech>>
<<speech "You" $name>>
Sure hope so, dude. We gotta have hope.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Long time ago, man. Half those guys I couldn't tell you where they ended up. You and me were the only two who actually rolled the dice on anything. That counts for something. I think it does, anyway.
<</speech>>
<</if>>
<<case "startup">>
<<speech "You" $name>>
I still run the old company back through my head some nights. The parts I'd do differently.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
'Course you do. I did the same thing after I sold mine, just from the winning side, which is its own kind of haunted. The gap between your ending and my ending is luck and timing, dude. Anybody who tells you it's genius is selling something. You stepped up and swung. Most of the guys we knew never even got out of the dugout.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Yeah, well. I cashed out of mine before it could turn on me, and I'm not gonna stand here and pretend that was all me being smart. Could've gone the other way. Could've been my turn to lose the house. Buy you a beer either way, man.
<</speech>>
<</if>>
<<case "work">>
<<speech "You" $name>>
What are you even doing these days? Still "advising," whatever that's supposed to mean?
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Advising. Investing. Telling founders no, mostly. Honestly? Bored out of my skull half the time. I hit the number, and then it turns out nobody tells you what you're supposed to do once you've hit it. You still want something. You've got no idea how much I miss wanting something.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
I write checks, I take meetings, I golf more than any grown man should. It's a good problem, I'm not crying into my beer about it. But you'd have hated it, the boredom of it. You always needed the fight more than the money.
<</speech>>
<</if>>
<<case "ashley">>
<<speech "You" $name>>
Me and $wife.name are... I don't know, man. We're trying. Some days it's mostly just the trying.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Okay, I'm gonna say one dumb thing and then I'm gonna be serious, 'cause you know I love you. $wife.name is still an absolute smokeshow and a guy like you has no business waking up next to a rack like that. There. Out of my system.
<</speech>>
<<speech "Friend" $friend.name>>
Now the real part. She stayed. Through all of it, the money, the company, all of it, she stayed, and I watched her do it up close. That woman is the best thing that ever happened to you, full stop. Whatever you're doing to fix it, do more of it.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
She's out of your league, brother, always has been, and I say that with nothing but love. She stuck around through the absolute worst of you. Repair that shit between you guys. That's all I've got. I move money around, I don't fix marriages.
<</speech>>
<</if>>
<<case "sports">>
<<speech "You" $name>>
You catch the game?
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Do not get me started. Blew a fourteen-point lead in the fourth. Our guys, our actual school, on national TV, in front of God and everybody. I aged a full year watching it. You and me were never built for hope, man. We should know that by now.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Caught the back half in here. These guys were hollering about it, same faces, same hot takes every week. You forget what it's like, talking to people who've known you longer than five minutes.
<</speech>>
<</if>>
<<case "checkin">>
<<speech "You" $name>>
I'm doing alright, you know. In case you were wondering.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
I wasn't wondering, I was watching. Those are different things. You're carrying it better than you were six months ago, I'll give you that much. Just don't go dark on me again. You do not have to be winning to pick up the phone. That was never the deal between us.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Yeah, you keep saying that. Said it for about three years straight while you went under, and all I ever got back was voicemail. I'm not busting your balls. I'm just telling you the line's open. Always was. You're the one who keeps forgetting it.
<</speech>>
<</if>>
<<case "cheat_ons">>
<<speech "You" $name>>
That girl I took home from here. I shouldn't have. But God, $friend.name, she was so damn hot, and me and $wife.name hadn't... I don't know. I keep finding new ways to make it not my fault.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Hey, you're talking to the wrong priest, brother. My hands aren't clean either. There was one a few months back, I was out of town, and she was... unreal, man. And I swear I had the whole excuse written in my head before I'd even crossed the lobby. Different city, so it doesn't count. Like there's a border on it.
<</speech>>
<<speech "Friend" $friend.name>>
And this is the part I only say to you. I knew. Every second of it, I knew exactly what I was doing, and I did it anyway, and I started blaming her for being that hot before I'd even touched her. So do you. We're not confused men, you and me. We just love pretending we are.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
She was hot, right? So what's the actual problem. You didn't fall in love, you didn't move her into the guest room. Guys like us have got a lot of want and only one life, and I'm not about to sit here and act like I'm any better. You enjoy it, you regret it, and now just forget it. Pretend like it never happened and eventually you'll believe it.
<</speech>>
<</if>>
<<case "cheat_sw">>
<<speech "You" $name>>
That thing down by the canal. The... you know. Honestly, I don't even count it. There's no feelings in it, $friend.name. It's basically just a fancier way of jerking off.
<</speech>>
<<if $friend.relationship >= 15>>
<<speech "Friend" $friend.name>>
Yeah. I've run that exact line on myself, word for word. No feelings, it's a transaction, it's self-care with a co-pay. It's incredible what a man can talk himself into around one in the morning.
<</speech>>
<<speech "Friend" $friend.name>>
But you and me both know if $wife.name found out, "there were no feelings involved" is not the sentence that walks you out of that room. We know right where the line is, man. We just stand on the wrong side of it and squint until we can't see it.
<</speech>>
<<else>>
<<speech "Friend" $friend.name>>
Nah, that's different, you're right. No numbers exchanged, no second date, nobody's heart's in it. It's a service, you paid for it, it's done. I tell myself the same thing and I sleep just fine. You want a clean conscience, that's sold somewhere else.
<</speech>>
<</if>>
<<case "sw_suggest">>
<<speech "Friend" $friend.name>>
Okay. Dangerous idea, stop me if I'm out of line. That woman who works the towpath down by the canal. It's early enough, and I'm drunk enough, and you've got that look you get. Two grown men, a cab, a thing we both agree never happened.
<</speech>>
<<speech "You" $name>>
$friend.name. Christ.
<</speech>>
<<speech "Friend" $friend.name>>
I'll cover the cab. I'm not covering your half of the rest, I'm rich, not a charity. When did you last do something you'd actually have to lie about? ...Bad example. When did you last do a fun one?
<</speech>>
<</switch>>
<<if $friend.topic === "sw_suggest">>
<br>
<<if $money >= 75>>
<<link "Split a cab to the canal and go find her. ($75)" "Canal SW Friend">>
<<set $money -= 75>>
<<set $arousal = Math.max($arousal - 10, 0)>>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $friend.relationship += 1>>
<</link>>
<<else>>
//$friend.name is already eyeing the door for a cab, but your share would be $75 and you're short. He's generous, not that generous.//
<</if>>
<br>
<<link "Laugh him off and call it a night." $return>><</link>>
<<else>>
<br>
<<link "Get the next round in, then head off." $return>><</link>>
<</if>><h2>Her Place</h2>
<<set $onsEver = true>>
<<if not $ex.live and random(1, 100) <= 60>>
<<set $ex.live = true>>
<<set $ex.saved = false>>
<<set $ex.pending = false>>
<<set $ex.day = $gameDay>>
<<set $ex.scares = 0>>
<</if>>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set _gifs = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _gifs.push("ons" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/ons/' + _gifs.random()" width="100%">
</div>
<br>
<<set _scene = [
"Her flat feels like a stranger’s place, the furniture and the scent of her life pressing in from every side, but the booze keeps your head quiet. You shove her against the hallway wall the second the door clicks shut. Your hands yank her dress up, fingers hooking her panties aside as you free your cock and slam into her wet pussy in one rough thrust. She gasps, legs wrapping around you, and you fuck her hard against the wall, hips snapping, balls slapping her ass with every deep plunge. Her cunt grips you tight, slick and hot, and you pound her until your thighs burn. Afterward she is already half asleep, and you find your clothes in the dark.",
"You barely register the room around you. Her breath tastes like whiskey when your mouths crash together. You shove her onto the unfamiliar bed, yank her jeans and panties down in one motion, then drive your cock straight into her soaked pussy. She moans and spreads wider as you slam into her, the mattress creaking under every brutal thrust. She claws at your back, pulling you harder into her cunt. You flip her onto her stomach, grip her hips, and fuck her from behind, burying yourself to the hilt again and again. Her pussy milks your cock as she comes, and you follow right after. When you finally pull out she is already drifting off, the sheets damp beneath her. You find your clothes in the dark and dress without looking back."
]>>
<<= _scene.random()>>
<br><br>
<<link [[Slip out and head home.|Living Room]]>><</link>><h2>The Anchor</h2>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set _barImg = "images/characters/npc/bar" + random(1, 7) + ".jpeg">>
<<set _approach = [
"You carry your drink down the bar before the nerve goes, and find a line that isn't quite as smooth as it sounded in your head. She lets you finish it anyway.",
"You take the stool beside her and say something. She turns, looks you over without hurry, and decides whether you're worth the next five minutes.",
"You go over. The opener is nothing special, but she laughs, or is kind enough to, and for a moment the night could go either way."
]>>
<div class="intro-image">
<img @src="_barImg" width="100%">
</div>
<br>
<<= _approach.random()>>
<br><br>
/* Success roll. base + fitness + a drunkenness sweet spot peaking at $drunk 3
+ a little job-level swagger. Tune any of the four freely. */
<<set _chance = Math.max(5, Math.min(90,
10
+ ($fitnessTier * 8)
+ (20 - (Math.abs($drunk - 3) * 7))
+ (($job.level - 1) * 3)
))>>
<<if random(1, 100) <= _chance>>
<<set _win = [
"Whatever you said, it lands. The talk runs easy and the drinks keep coming. At some point you set your glass down and ask whether you should walk her home. She is down.",
"After a few drinks, she leans in closer than the noise strictly requires. When she says her place is two streets over, it isn't really a question, and you're already reaching for your coat."
]>>
<<= _win.random()>>
<br><br>
<<link "Go with her." "Anchor ONS">>
<<set $onsToday = true>>
<</link>>
<<else>>
<<if $drunk >= 6>>
<<set _lose = [
"The words slur heavier than you mean them to, and she watches you find the end of the drunken sentence with the patience of someone already deciding against it. She's gone to find her friends before you've quite landed the point.",
"You're drunker than you'd let yourself believe, and she can see it. She's polite about it, pats your arm like out of friendly pity, and turns back to the bar."
]>>
<<else>>
<<set _lose = [
"It just doesn't catch. She's friendly enough, gives you a couple of minutes, then her attention drifts back to her phone in the way that means the door is closed.",
"She clocks the pale band on your finger, or maybe just the married look that comes off you whether the ring is there or not, and the warmth goes out of it. She wishes you a good night and means goodbye."
]>>
<</if>>
<<= _lose.random()>>
<br><br>
<<link "Back to your drink." $return>><</link>>
<</if>><h2><<print passage()>></h2>
<<if $wife.location == "bathroom" and !($wife.relationship >= 25 or ($wife.mood >= 1 and $wife.relationship >= 0))>>
<<include 'Bathroom, Eject'>>
<<else>>
<<include 'Bathroom, Description'>>
<<include 'Bathroom, Triggers'>>
<<include 'Bathroom, Basics'>>
<<include 'House, Transport'>>
<</if>><h2>Bathroom Door</h2>
The door is shut. You can hear water moving on the other side.
<br><br>
''What do you do?''
<br>
<<if $wife.relationship >= 25 or ($wife.mood >= 1 and $wife.relationship >= 0)>>
<<link "Knock and step inside." "Bathroom">><</link>>
<<else>>
<<link "Knock and ask to come in." "Bathroom Refused">>
<<moodShift -1 -1>>
<</link>>
<</if>>
<br>
<<if !$wife.spiedToday>>
<<link "Try to peek through the gap." "Bathroom Spy">><</link>>
<<else>>
//You've already pushed your luck once today.//
<</if>>
<br>
<<link "Leave her be." $return>><</link>><h2>Bathroom Door</h2>
You knock. There's a pause, then her voice through the door, low and tight.
<br><br>
<<speech "Wife" $wife.name>>
Just give me five minutes. Please.
<</speech>>
<br><br>
<<link "Step away." $return>><</link>><h2>Bathroom Door</h2>
You ease toward the door and angle yourself to the narrow gap by the hinge.
<br><br>
<<set $wife.spiedToday = true>>
<<set _catchChance = Math.max(25, Math.min(90, 45 - $wife.mood * 15))>>
<<if random(1, 100) <= _catchChance>>
<div class="char-scene">
<img @src="either('images/characters/w/w_shower1.jpeg', 'images/characters/w/w_shower2.jpeg', 'images/characters/w/w_shower3.jpeg', 'images/characters/w/w_shower4.jpeg')" class="char-img">
<div class="char-text">
You catch a glimpse through the gap. Bare skin slick with water, the curve of her back as she rinses her hair. Then the latch shifts under your weight and gives you up. She turns sharply, sees you, and her face goes hard. <span class="arousal">Arousal increased.</span>
<br><br>
<<speech "Wife" $wife.name>>
Are you serious right now? What is wrong with you?
<</speech>>
</div>
</div>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<moodShift -2 -3>>
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_shower1.jpeg', 'images/characters/w/w_shower2.jpeg', 'images/characters/w/w_shower3.jpeg', 'images/characters/w/w_shower4.jpeg')" class="char-img">
<div class="char-text">
For a moment you watch unnoticed. The line of her shoulder, the curve of her hip, steam rising off the tile, water tracing every inch of her skin. Then a board creaks under your foot and you ease back before she turns. <span class="arousal">Arousal increased.</span>
</div>
</div>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<</if>>
<<link "Step away." $return>><</link>>/* Shower */
The shower waits behind a thin curtain, the water always taking a moment to warm up.
<br>
<<if $time >= $timeMax>>
//It's too late in the day for a cold shower.//
<<elseif $arousal >= 3>>
<<link "Take a cold shower to clear your horny head a bit." $return>>
<<set $arousal = Math.max($arousal - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<</link>>
<<else>>
//Clear-headed enough. A shower can wait.//
<</if>>
<<soloVent "bathroom">>/* Base description */
A small bathroom with a shower over the tub, a sink set into a narrow vanity, and a mirror that has seen better days. Tile runs halfway up the walls, the grout a shade darker than it should be in the corners. The window above the toilet is frosted glass, letting through only a vague suggestion of the world outside.
/* Time */
<<switch $time>>
<<case 0>>Early morning light filters dimly through the frosted window, the tile cool underfoot.
<<case 1>>Late morning brings a softer light through the window, the air still damp from the morning's first shower.
<<case 2>>Midday settles into the bathroom, quiet apart from the slow drip of the tap.
<<case 3>>Afternoon barely reaches in, the room dim and a little stale.
<<case 4>>Late afternoon leaves the bathroom in half-light, the mirror catching the lamp from the corridor.
<<case 5>>Early evening dims the room further, only the hallway light pushing in from outside.
<<case 6>>Evening leaves the bathroom in shadow until you flick the switch, the bulb humming briefly before steadying.
<<case 7>>Late evening turns the room small and contained, the world reduced to the hum of pipes and the rim of light around the door.
<<case 8>>Night fills the bathroom completely, the tiles cold under your feet.
<</switch>>
<br><br><<include 'Bathroom, Description'>>
$wife.name pushes the door open and stops short when she sees you still in here. Her jaw sets.
<br><br>
<<speech "Wife" $wife.name>>
Out. I'd like a minute to myself.
<</speech>>
<br><br>
<<moodShift -1>>
<<link [[Step out.|Living Room]]>><</link>><<if $wife.location == "bathroom">>
<<if $wife.relationship >= 50 and $wife.mood >= 1>>
/* SHOWER tier - she lets you see her naked */
<div class="char-scene">
<img @src="either('images/characters/w/w_shower1.jpeg', 'images/characters/w/w_shower2.jpeg', 'images/characters/w/w_shower3.jpeg', 'images/characters/w/w_shower4.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 2>>
$wife.name is in the shower, the curtain pulled half open. She catches your eye through the steam and doesn't bother covering up.
<<else>>
$wife.name is in the shower, water tracing down her skin. She glances over when you come in but doesn't reach for the curtain.
<</if>>
<<if not $wife.bathroomViewedToday>> <span class="arousal">Arousal increased.</span><</if>>
</div>
</div>
<<if !$wife.bathroomViewedToday>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set $wife.bathroomViewedToday = true>>
<</if>>
<<elseif $wife.relationship >= 25 and $wife.mood >= 0>>
/* TOWEL tier - drying after a bath */
<div class="char-scene">
<img @src="either('images/characters/w/w_towel1.jpeg', 'images/characters/w/w_towel2.jpeg', 'images/characters/w/w_towel3.jpeg', 'images/characters/w/w_towel4.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is drying herself after a bath, skin still pink from the heat. She catches your reflection and gives you a small look but keeps working the towel.
<<else>>
$wife.name is drying herself after a bath, the towel moving in slow, distracted strokes. She doesn't look up when you come in.
<</if>>
<<if not $wife.bathroomViewedToday>> <span class="arousal">Arousal increased.</span><</if>>
</div>
</div>
<<if !$wife.bathroomViewedToday>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $wife.bathroomViewedToday = true>>
<</if>>
<<else>>
/* CLOTHED tier - fully dressed routine */
<div class="char-scene">
<<if $time <= 1>>
<img @src="'images/characters/w/w_sleepwearBathroom1.jpeg'" class="char-img">
<<else>>
<img @src="either('images/characters/w/w_casualBathroom1.jpeg', 'images/characters/w/w_casualBathroom2.jpeg')" class="char-img">
<</if>>
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is at the mirror, going through her routine. She meets your eye in the glass.
<<elseif $wife.mood == 0>>
$wife.name is at the mirror, going through her routine.
<<else>>
$wife.name is at the mirror, her eyes fixed on her reflection, jaw set.
<</if>>
</div>
</div>
<</if>>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "bathroom">><h2><<print passage()>></h2>
<<include 'Bedroom, Description'>>
<<include 'Bedroom, Triggers'>>
<<include 'Bedroom, Basics'>>
<<include 'House, Transport'>>/* Bed */
The bed rests against the wall, its presence steady and familiar.
<br>
<<if $time >= 6>>
<<link 'Sleep until tomorrow.' "Sleep">><</link>>
<<else>>
//It's too early to sleep.//
<</if>>
<<soloVent "bedroom">>
<br><br>
/* Desk */
<<if $items.pc>>
A small desk holds your computer, the screen dark for now.
<br>
<<link [[Use the computer.|Computer]]>><</link>>
<<else>>
A small desk sits against the wall, its surface mostly clear, a chair tucked in beneath it.
<br>
//If you had a computer, you could set it up here.//
<</if>>/* Base description */
A simple bedroom with a double bed against the main wall. Two bedside tables sit on either side, with a wardrobe and chest of drawers providing basic storage. A reading lamp rests within reach of the bed, and curtains cover the window.
/* Time description */
<<switch $time>>
<<case 0>>Early morning light filters in softly, carrying the promise of a new day.
<<case 1>>Late morning light settles into the room, steady and unhurried.
<<case 2>>Midday arrives plainly, the room evenly lit and still.
<<case 3>>Afternoon drifts through, quiet and unremarkable.
<<case 4>>The late afternoon slants through the curtains, the light beginning to soften.
<<case 5>>Early evening warms the room, shadows lengthening across familiar surfaces.
<<case 6>>Evening settles in, the room quiet and the day giving way to its slower hours.
<<case 7>>Late evening dims the room, lamps casting soft pools of light against the dark.
<<case 8>>Night settles fully, the room dark and withdrawn from the world outside.
<</switch>>
/* Chore State */
<<if $chores.bedroom>>
<span class="good">The room is tidy and in order.</span>
<<else>>
<span class="warning">The bed is unmade, and a few things have been left out of place.</span>
<</if>>
/* Bedroom Chore */
<<chore "bedroom" "Tidy the bedroom.">>
<br><br>/* Fitness Feedback */
<<fitnessFeedback>>
/* Wife is here */
<<if $time == 7>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearBedroom1.jpeg', 'images/characters/w/w_sleepwearBedroom2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is here, getting ready for bed. She catches your eye in the mirror.
<<elseif $wife.mood == 0>>
$wife.name is here, getting ready for bed.
<<else>>
$wife.name is here, going through her routine without looking at you.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<wifeReact>>
<<elseif $time == 8>>
<<if $wife.wardrobeMalfunction>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearMalfunction1.jpeg', 'images/characters/w/w_sleepwearMalfunction2.jpeg','images/characters/w/w_sleepwearMalfunction3.jpeg','images/characters/w/w_sleepwearMalfunction4.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood <= -1>>
$wife.name is asleep, turned away from you. The blanket has slipped and her nightclothes have shifted up and she is unknowingly flashing her breasts. She'd probably be even more annoyed if she knew how you stood and took in the sight.
<<else>>
$wife.name is asleep, her breathing slow and steady. The blanket has slipped and her nightshirt has shifted up showing her breasts. You admire them for a while.
<</if>>
<<if not $wife.wardrobeSeen>> <span class="arousal">Arousal increased.</span><</if>>
</div>
</div>
<<if not $wife.wardrobeSeen>>
<<set $wife.wardrobeSeen = true>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<</if>>
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearSleeping1.jpeg', 'images/characters/w/w_sleepwearSleeping2.jpeg','images/characters/w/w_sleepwearSleeping3.jpeg','images/characters/w/w_sleepwearSleeping4.jpeg','images/characters/w/w_sleepwearSleeping5.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood <= -1>>
$wife.name is asleep, turned away from your side of the bed.
<<else>>
$wife.name is asleep, her breathing slow and steady.
<</if>>
</div>
</div>
<</if>>
<<elseif $weekday >= 6 and $time == 0>>
<div class="char-scene">
<img @src="either('images/characters/w/w_sleepwearBedroom1.jpeg', 'images/characters/w/w_sleepwearBedroom2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is still in bed, relaxed in the soft morning light. She shifts to make room when you come in.
<<elseif $wife.mood == 0>>
$wife.name is still in bed, relaxing in the soft morning light.
<<else>>
$wife.name is still in bed, turned away from the door, the blanket pulled up high.
<</if>>
<<if $wife.mood >= 0 and not $wife.lazyMorningToday>>
<br>
<<link "Crawl back in beside her for a while." "Lazy Morning">><</link>>
<br>
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "bedroom">><h2>Lower Hill Boxing Club</h2>
A converted warehouse off the canal, the sign above the door faded to a ghost of itself. Inside it smells of sweat, old leather, and the kind of disinfectant that doesn't fool anyone. A ring takes up the center, heavy bags hang in two rows along the wall, and a couple of regulars are usually working a rhythm on the speed bags. The owner, a thickset man called Vance, runs the place more out of stubbornness than profit.
<<switch $time>>
<<case 0>>Early morning. A handful of older men are already here, working their rounds in silence. The radio is on low.
<<case 1>>Late morning. The place is quiet, just Vance behind the counter and one kid hitting the heavy bag with more anger than technique.
<<case 2>>Midday. The lunch crowd, such as it is. A few office shirts on hangers by the changing room door.
<<case 3>>Early afternoon. Quiet again. Vance is on a phone call he isn't enjoying.
<<case 4>>Late afternoon. The after-work rush is starting, the bags all in use, the air heavier already.
<<case 5>>Early evening. The place is busy. The smell is rich. Somebody on the bag has good form and is making sure everyone knows it.
<<case 6>>Evening. Last classes are wrapping up. Vance is rolling down the shutters at the front.
<<case 7>>The shutters are down. The club is closed.
<<case 8>>The club is closed.
<</switch>>
<br><br>
<<if $time >= 7>>
//The club is closed for the night.//
<<else>>
A session costs $15.
<br>
<<workout "Pay for a session and train hard." 2 1 2 15>>
<</if>>
/* Saturday bareknuckle fighting */
<<if $weekday == 6 and ($time == 5 or $time == 6)>>
<br><br>
The ring in the center is roped off and the heavy bags shoved back against the walls. There's a bareknuckle card tonight, the kind Vance doesn't advertise and the police don't drop in on. A crowd is already thickening around the ropes.
<br>
<<if $fitnessTier >= 1 and not $foughtToday and $energy >= 3>>
Vance leans in, voice low. //"Bare fists, no names, cash to the man left standing. You want in?"//
<br>
<<link "Enter the card." "Boxing Fight">><</link>>
<br>
<<elseif $fitnessTier < 1>>
//Vance shakes his head before you ask. You're not stepping in there in the shape you're in. But you can watch.//
<br>
<<elseif $foughtToday>>
//You've already left it all in the ring tonight. One card is enough.//
<br>
<<elseif $energy < 3>>
//You're dead on your feet. No fighting tonight, but you can stand at the ropes.//
<br>
<</if>>
<<link "Watch from the crowd." "Boxing Spectate">><</link>>
<</if>>
<br><br>
<<link [[Back out to the canal.|Canal Path]]>><</link>><h2>The Ring</h2>
<<set $foughtToday = true>>
<<addWorry 2>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<div class="intro-image wide">
<img @src="either('images/scenes/boxing/boxing_pov1.jpeg', 'images/scenes/boxing/boxing_pov2.jpeg')" width="100%">
</div>
<br>
/* Win chance scales with conditioning. Tune the 25 and 13. */
<<set _winChance = 25 + $fitnessTier * 13>>
<<set _won = (random(1, 100) <= _winChance)>>
<<if _won>>
<<set _purse = 50 + $fitnessTier * 25 + random(0, 20)>>
<<set $money += _purse>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $fitness += 2>>
<<set _winText = [
"The crowd packs in around the ropes, cigarette smoke and money already moving in folded handshakes. Your opponent is bigger and slower, and somewhere in the second round you find the old rhythm, the one that lived in your hands before the weight and the desk. You put him down on the canvas, and Vance counts the bills into your palm before you've got your breath back.",
"No gloves, no headgear, no scorecard, just two men and a crowd that paid to watch one of them fold. Your hands are wrecked by the end and your face will tell the story for a week, but you read him early and you drop him. The man with the bag pays out without meeting your eye."
]>>
<<= _winText.random()>>
<br><br>
<span class="good">You won the bout. Purse: $<<print _purse>>.</span>
<<else>>
<<set _purse = 15>>
<<set $money += _purse>>
<<set $energy = Math.max($energy - 4, 0)>>
<<set $fitness += 1>>
<<moodShift -1>>
<<set _lossText = [
"Bare knuckles punish the rusty, and the rust on you is realer than you let yourself believe. You catch one clean punch to chin and the lights swim and the canvas comes up to meet you. You last longer than the crowd expected though not as long as you needed to. Vance presses a few bills into your hand out of something like pity and tells you to ice the hand.",
"Your opponent is younger, hungrier, and he has done this more recently than you. Without gloves and headgear there's nowhere to hide, and he finds your face again and again until the round saves you. You stay upright to the end, which is the most that can be said. A thin fold of show money, and a walk home you'll feel for days."
]>>
<<= _lossText.random()>>
<br><br>
<span class="warning">You lost. Show money: $<<print _purse>>.</span>
<</if>>
<br><br>
<<link "Head back out." $return>><</link>><h2>At the Ropes</h2>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.min($energy + 1, $energyMax)>>
<div class="intro-image wide">
<img src="images/scenes/boxing/boxing_ringside1.jpeg" width="100%">
</div>
<br>
<<set _watchText = [
"You find a gap at the ropes and watch. Two men you half recognize from the heavy bags trade bare-fisted shots until one of them stops getting up. It's ugly and honest in a way the rest of your week isn't, and you understand, a little, why men keep coming back to the bottom of this room.",
"You stand in the crowd and let the night happen. A wiry kid with fast hands takes apart someone twice his size, and the money moves around you in folded handshakes. Nobody asks your name. For an hour you are nothing but another face at the ropes, and it is almost restful.",
"The card runs three bouts while you watch. One ends in seconds, one drags until both men can barely lift their arms, and the last is close enough that the room forgets to breathe. You leave before the cash is fully counted, the smell of it still on you."
]>>
<<= _watchText.random()>>
<br><br>
<<link "Head back out." $return>><</link>><h2><<print passage()>></h2>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set _joggerImg = "images/characters/npc/jogger" + random(1, 5) + ".jpeg">>
<div class="char-scene">
<img @src="_joggerImg" class="char-img">
<div class="char-text">
<<set _lines = [
"A woman comes toward you on the path, moving at a good pace. She holds your eye for a beat longer than the narrow path requires, and neither of you slows.",
"You pass a jogger going the other way. She glances over as you draw level, and you catch yourself looking back over your shoulder once she's gone by.",
"A woman runs past close on the narrow stretch. For a second your eyes meet, and she's the one who doesn't look away first.",
"You nearly clip shoulders with a woman heading the other direction. She turns her head as you pass, and so do you, and the run feels different for the rest of it."
]>>
<<= _lines.random()>>
<span class="arousal">Arousal increased.</span>
</div>
</div>
<<link "Finish your run." $return>><</link>><h2><<print passage()>></h2>
The canal cuts through the back of the neighborhood, the path along it cracked asphalt patched in places with rougher gravel. On one side a row of warehouses, mostly converted, mostly to nothing useful. On the other, water dark with algae and the occasional shopping cart. In the distance, the Helion tower catches whatever light the day has left.
<<switch $time>>
<<case 0>>The path is empty in the early morning. Mist hangs over the water, and the only sound is your own breathing.
<<case 1>>Late morning brings a few cyclists and dog walkers, all moving with the unhurried purpose of people who don't have anywhere to be.
<<case 2>>Midday sun flattens the canal into a dull metallic shine. The benches are taken by men with cans they aren't trying to hide.
<<case 3>>Afternoon light slants across the water. A heron stands on the far bank, indifferent to everything.
<<case 4>>Late afternoon, and the path is starting to fill with people heading home, hands deep in pockets, eyes down.
<<case 5>>Early evening turns the water gold for a few minutes before letting it go again.
<<case 6>>Evening dims the canal, lamps coming on along the far bank in patchy intervals.
<<case 7>>Late evening, and the path is almost empty. The water is a black slick, the warehouses dark behind it.
<<case 8>>Night. The path is unlit in long stretches, and only a fool would jog it now.
<</switch>>
<br><br>
Not a bad place for getting some exercise.
<br>
<<if $time >= $timeMax>>
//It's too late for a run.//
<<elseif $arousal >= 8>>
//You can't focus on a run while this horny.//
<<elseif $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<<elseif $energy < 1>>
//You're too exhausted to train right now.//
<<else>>
<<link "Go for a run along the canal.">>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $fitness += 1>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
/* Roll for the jogger encounter on this run */
<<if random(1, 100) <= 40>>
<<goto "Canal Jogger">>
<<else>>
<<goto $return>>
<</if>>
<</link>>
<</if>>
<br><br>
A converted warehouse sits back from the path, the faded sign of the Lower Hill Boxing Club above its door.
<br>
<<if $time <= 6>>
<<link [[🥊 Head into the boxing club.|Boxing Club]]>><</link>>
<<else>>
//The boxing club has its shutters down for the night.//
<</if>>
/* Evening: Lady of the night */
<<if $time >= 5 and $time < $timeMax>>
<br><br>
<div class="char-scene">
<img @src="either('images/characters/npc/sw1_1.jpeg', 'images/characters/npc/sw1_2.jpeg')" class="char-img">
<div class="char-text">
A blonde woman is waiting where the lamplight gives out, scanning the path. She catches your eye and holds it as you pass.
<br>
<<link '//"Looking for some company?"//' "Canal SW Approach">><</link>>
</div>
</div>
<<else>>
<br><br>
<</if>>
<<link [[🏠 Go home|Living Room]]>><</link>><h2>Lady of the Night</h2>
<div class="char-scene">
<img @src="either('images/characters/npc/sw1_1.jpeg', 'images/characters/npc/sw1_2.jpeg')" class="char-img">
<div class="char-text">
You slow, and she falls into step, steering the two of you into the dark stretch past the last working lamp. Up close she is older than the lamplight suggested, her smile worn smooth from use. She names her prices without much ceremony.
</div>
</div>
<br><br>
<<if $money >= 30>>
<<link "Pay for a handjob. ($30)" "Canal SW Physical">>
<<set $money -= 30>>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<addSuspicion 1>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $swService = "hj">>
<</link>>
<<else>>
//A handjob ($30), but you're short.//
<</if>>
<br>
<<if $money >= 50>>
<<link "Pay for a blowjob. ($50)" "Canal SW Physical">>
<<set $money -= 50>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<addSuspicion 2>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $swService = "bj">>
<</link>>
<<else>>
//A blowjob ($50), but you're short.//
<</if>>
<br>
<<if $money >= 90>>
<<link "Pay for sex. ($90)" "Canal SW Physical">>
<<set $money -= 90>>
<<set $arousal = Math.max($arousal - 10, 0)>>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $swService = "sex">>
<</link>>
<<else>>
//Sex ($90), but you're short.//
<</if>>
<br><br>
<<link "Think better of it and walk on." $return>><</link>><h2>Her Flat</h2>
<<set _gifs = []>>
<<for _i = 1; _i <= 5; _i++>>
<<set _gifs.push("sw1_mmf" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/sw/' + _gifs.random()" width="100%">
</div>
<br>
<<set _scene = [
"She doesn't even blink at the pair of you on her step, just adjusts the number and stands aside. The flat is the same lamplit, lived-in dim as before, only now there's $friend.name filling the doorway behind you, drunk, loud and with a big grin on face. A couple of minutes later she is sitting on the edge of the bed sucking you off in turns, and the inital awkwardness lifts. Before long, you are spitroasting her, and she takes it like the professional she is. Afterward $friend.name is already telling it back to you like a story, and you both laugh, because the alternative is thinking about it.",
"The cab ride is all $friend.name, narrating the night like it's already legendary. She meets you at the foot of the stair, counts the cash without a word, and takes the two of you up. What follows is messy and warm and faintly absurd, the kind of thing you'll both reference for years and never once describe out loud. She sees you out together when it's done, the same brisk shopkeeper's kindness as before, and the night air is cold and clarifying. After a moment outside, you meet $friend.name's eyes, before you both both break into a drunken, knowing and slightly guilty laugh."
]>>
<<= _scene.random()>>
<br><br>
<<link "Head home." "Living Room">><</link>><h2>Her Flat</h2>
<<set $swEver = true>>
<<switch $swService>>
<<case "hj">>
<<set _gifs = ["sw1_hj1.gif", "sw1_hj2.gif"]>>
<<case "bj">>
<<set _gifs = ["sw1_bj1.gif", "sw1_bj2.gif"]>>
<<case "sex">>
<<set _gifs = ["sw1_h1.gif", "sw1_h2.gif"]>>
<</switch>>
<div class="intro-image">
<img @src="'images/h/sw/' + _gifs.random()" width="100%">
</div>
<br>
<<switch $swService>>
<<case "hj">>
She leads you up the narrow stair to the flat that reeks of someone else's stale smoke and sweat. Her grip is tight and slick from the lube she keeps by the bed, stroking your cock in fast, mechanical pumps while her eyes stay glued to the window like she's already thinking about the next client. Your cock throbs in her fist, balls tightening fast under the relentless tug, and you spill thick ropes of cum across her knuckles before you've even caught your breath. She wipes the mess off on the towel she keeps ready, then nods toward the door and tells you to mind the step on the way down.
<<case "bj">>
The flat is small and dim, a lamp draped with a scarf doing the lighting. She takes a little more time than the price strictly buys, unhurried in the way of someone who has done this a great deal. After you've finished in her mouth, she sees you to the door with the brisk, almost kind efficiency of a woman closing up a shop.
<<case "sex">>
Her flat is warmer than you expected, lived in, a kettle somewhere and a coat thrown over a chair. For a little while, in the lamplight, it is easy to mistake it for something it isn't, and she is good at letting you. You don't last long, and catch your breath in her sheets while she throws away the condom. She's already half dressed and ordinary again by the time you find your shoes.
<</switch>>
<br><br>
<<link "Head back out." $return>><</link>><h1>$name</h1>
''Physique''
<br>
Looking at your fitness and physique, you're
<<switch $fitnessTier>>
<<case 5>>
in peak condition. Your body feels powerful and finely tuned. Maintaining this will take discipline.
<<case 4>>
very athletic. You move with strength and confidence. A bit more training could push you even further.
<<case 3>>
athletic. You're clearly in good shape. Staying consistent will keep you improving.
<<case 2>>
fit. You're making solid progress. Regular training will take you to the next level.
<<case 1>>
getting in shape. The changes are starting to show. Keep it up.
<<default>>
out of shape. Even light training would make a noticeable difference.
<</switch>>
<br>
<<if $fitnessTier >= 5>>
<<meter 1 1 "Peak condition" "#FF9F40">>
<<else>>
<<set _prev = [0, 10, 15, 20, 30][$fitnessTier]>>
<<set _next = [10, 15, 20, 30, 45][$fitnessTier]>>
<<set _progress = $fitness - _prev>>
<<set _target = _next - _prev>>
<<meter _progress _target "Next level" "#FF9F40">>
<</if>>
<br><br>
''Home''
<br>
Home is a cramped two-bedroom flat off the bypass, the radiators loud and half the boxes still in the hall. It's a roof, and not much more than that. <strong>Rent runs $<<print $rent>> a week</strong>, due every Sunday.
<<if $money >= $rent>>
You've got enough on hand to cover the next one.
<<else>>
As things stand, you're short of the next one.
<</if>>
<br><br>
''Work''
<br>
You work at <strong>Helion Dynamics</strong> as a <strong>$job.title</strong>, earning $<<print $job.wage>> per day.
<br><br>
<<if $job.level >= 5>>
You've reached the top of the ladder here. There's nowhere left to climb.
<<else>>
<<set _prev = [0, 0, 10, 25, 45][$job.level]>>
<<set _next = [0, 10, 25, 45, 70][$job.level]>>
<<set _progress = $job.performance - _prev>>
<<set _target = _next - _prev>>
<<meter _progress _target "Next promotion" "#3D73FC">>
<<if $job.promotionPending>>
<span class="good">Word is you're due a promotion. You'll hear about it next time you're in the office.</span>
<</if>>
<</if>>
<br><br>
<<link 'Return' $return>>
<</link>><h2>Computer</h2>
<<if $pcMsg !== "">>
<span class="good"><<= $pcMsg>></span>
<br><br>
<<set $pcMsg = "">>
<</if>>
You sit down at the desk and wake the screen.
<br><br>
''Your side project''
<br>
<<if $project.started>>
Your game sits at version <<print $project.version>>.0, with <<print $project.supporters>> supporters putting $<<print $project.weeklyIncome>> a week your way.
<<else>>
A blank project folder waits. You've thought for years about building your own game, the kind you can't find in stores. Maybe it's time you actually did.
<</if>>
<br>
<<if $energy < 1>>
//You're too drained to write a line of anything.//
<<elseif $time >= $timeMax>>
//It's too late to focus on it tonight.//
<<else>>
<<link "Work on your game." "Computer">>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $project.started = true>>
<<set $project.dev += 1>>
<<if $project.dev >= $project.devNeeded>>
<<set $project.dev = 0>>
<<set $project.version += 1>>
<<set _gain = random(2, 4) + $project.version>>
<<set $project.supporters += _gain>>
<<set $project.devNeeded += 2>>
<<set $project.weeklyIncome = $project.supporters * 2>>
<<set $pcMsg = "You ship version " + $project.version + ".0. Word gets around, and " + _gain + " new supporters pledge. Your page now brings in $" + $project.weeklyIncome + " a week.">>
<<else>>
<<set $pcMsg = "You sink an hour into the project. It's coming along.">>
<</if>>
<</link>>
<</if>>
<<if $project.started>>
<br>
<<link "Check your supporter page." "Project Page">><</link>>
<</if>>
<br><br>
''Helion work''
<br>
<<if $job.wfhToday>>
//You've already put in extra hours from home today.//
<<elseif $arousal >= 8>>
//You can't focus on work while this wound up.//
<<elseif $energy < 2>>
//You're too drained for more of Helion's work tonight.//
<<elseif $time >= $timeMax>>
//It's too late to get any real work done.//
<<else>>
You could put in some extra hours, get ahead of the backlog, make yourself harder to overlook.
<br>
<<link "Work from home for Helion." "Computer">>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $job.performance += 0.5>>
<<set $job.wfhToday = true>>
<<promotionCheck>>
<<if $job.promotionPending>>
<<set $pcMsg = "You grind through a few extra tickets. Your standing's high enough now that a promotion feels close.">>
<<else>>
<<set $pcMsg = "You grind through a few extra tickets. It won't go unnoticed.">>
<</if>>
<</link>>
<</if>>
<br><br>
/* FUTURE: once $job.level reaches Lead+, the clock-in expectation in workCheck
could ease, with most work handled here and office visits optional. That arc
belongs with the assistant character and her romance, not here yet. */
<<link "Step away from the desk." $return>><</link>><h1><<print passage()>></h1>
''Time''
<br>
Time ($time):
<<link '+' 'Control Panel'>>
<<set $time += 1>>
<<if $time > $timeMax>><<set $time = $timeMax>><</if>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $time -= 1>>
<<if $time < 0>><<set $time = 0>><</if>>
<</link>>
<br>
Day ($gameDay):
<<link 'Next Day' 'Control Panel'>>
<<dayshift>>
<</link>>
/
<<link 'Previous Day' 'Control Panel'>>
<<set $gameDay -= 1>>
<<if $gameDay < 1>><<set $gameDay = 1>><</if>>
<<set $weekday -= 1>>
<<if $weekday < 1>><<set $weekday = 7>><</if>>
<</link>>
<br><br>
''Stats''
<br>
Energy ($energy):
<<link '+' 'Control Panel'>>
<<set $energy += 1>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $energy -= 1>>
<</link>>
<br>
Max Energy ($energyMax):
<<link '+' 'Control Panel'>>
<<set $energyMax += 1>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $energyMax -= 1>>
<</link>>
<br>
Fitness ($fitness):
<<link '+' 'Control Panel'>>
<<set $fitness += 1>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $fitness -= 1>>
<</link>>
<br>
Arousal ($arousal):
<<link '+' 'Control Panel'>>
<<set $arousal += 1>>
<<if $arousal > $arousalMax>><<set $arousal = $arousalMax>><</if>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $arousal -= 1>>
<<if $arousal < 0>><<set $arousal = 0>><</if>>
<</link>>
<br><br>
''Relations''
<br>
$wife.name Relationship ($wife.relationship):
<<link '+5' 'Control Panel'>>
<<set $wife.relationship += 5>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $wife.relationship += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $wife.relationship -= 1>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $wife.relationship -= 5>>
<</link>>
<br>
$wife.name Mood ($wife.mood):
<<link '+' 'Control Panel'>>
<<set $wife.mood += 1>>
<<if $wife.mood > 3>><<set $wife.mood = 3>><</if>>
<</link>>
/
<<link '-' 'Control Panel'>>
<<set $wife.mood -= 1>>
<<if $wife.mood < -3>><<set $wife.mood = -3>><</if>>
<</link>>
<br>
$wife.name Suspicion ($wife.suspicion):
<<link '+5' 'Control Panel'>>
<<set $wife.suspicion += 5>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $wife.suspicion += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $wife.suspicion -= 1>>
<<if $wife.suspicion < 0>><<set $wife.suspicion = 0>><</if>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $wife.suspicion -= 5>>
<<if $wife.suspicion < 0>><<set $wife.suspicion = 0>><</if>>
<</link>>
<br>
Suspicion Locked ($wife.suspicionLocked):
<<link 'Toggle' 'Control Panel'>>
<<set $wife.suspicionLocked = not $wife.suspicionLocked>>
<</link>>
<br>
<<link 'Preview discovery scene (non-destructive)' 'Wife Discovery'>>
<<set $wife.discoveryResult = 15>>
<</link>>
<br>
$wife.name Worry ($wife.worry):
<<link '+5' 'Control Panel'>>
<<set $wife.worry += 5>>
<</link>>
/
<<link '+1' 'Control Panel'>>
<<set $wife.worry += 1>>
<</link>>
/
<<link '-1' 'Control Panel'>>
<<set $wife.worry -= 1>>
<<if $wife.worry < 0>><<set $wife.worry = 0>><</if>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $wife.worry -= 5>>
<<if $wife.worry < 0>><<set $wife.worry = 0>><</if>>
<</link>>
<br>
<<link 'Preview worry scold (non-destructive)' 'Wife Worry'>>
<<set $wife.worryResult = 4>>
<</link>>
<br><br>
''Work (debug)''
<br>
Performance ($job.performance):
<<link '+5' 'Control Panel'>>
<<set $job.performance += 5>>
<</link>>
/
<<link '-5' 'Control Panel'>>
<<set $job.performance -= 5>>
<</link>>
<br>
Level ($job.level): $job.title
<br>
<<link 'Level up (debug)' 'Control Panel'>>
<<if $job.level < 5>>
<<applyPromotion>>
<</if>>
<</link>>
<br>
<<link "Force promotion (debug)" $return>>
<<set $job.promotionPending = true>>
<</link>>
<br><br>
''Phone (debug)''
<br>
Nude ask today ($phone.nudeAskedToday) / Last nude day ($phone.lastNudeDay) / Cooldown ends day <<= $phone.lastNudeDay + $phone.nudeCooldown>>
<br>
<<link 'Unlock nude ask now' 'Control Panel'>>
<<set $phone.nudeAskedToday = false>>
<<set $phone.lastNudeDay = $gameDay - $phone.nudeCooldown>>
<</link>>
<br>
<<link 'Clear "asked today" flag' 'Control Panel'>>
<<set $phone.nudeAskedToday = false>>
<</link>>
<br>
<<link 'Reset nude cooldown' 'Control Panel'>>
<<set $phone.lastNudeDay = $gameDay - $phone.nudeCooldown>>
<</link>>
<br>
<<link 'Queue wife photo (unread)' 'Control Panel'>>
<<set _nudes = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _nudes.push("w_phone_n" + _i + ".jpeg")>>
<</for>>
<<set $phone.wifePendingImg = _nudes.random()>>
<<set $phone.wifeUnread = true>>
<</link>>
<br><br>
''Inventory''
<br>
Money ($money):
<<link '+1000' 'Control Panel'>>
<<set $money += 1000>>
<</link>>
/
<<link '+100' 'Control Panel'>>
<<set $money += 100>>
<</link>>
/
<<link '-100' 'Control Panel'>>
<<set $money -= 100>>
<</link>>
<br><br>
<<link "Get PC (debug)" $return>>
<<set $items.pc = true>>
<</link>>
<<link "Get Yoga Mat (debug)" $return>>
<<set $items.yogaMats = true>>
<</link>>
<br>
<br>
<<link 'Return' $return>>
<</link>><h2>Sal's Pawn & Loan</h2>
A narrow shopfront wedged between the dead bakery and the Anchor. The window is a jumbled altar to other people's bad weeks: a saxophone, three wedding rings pinned to a velvet card, a drone still in its box, a stuffed marlin nobody came back for. Behind the counter sits Sal, a broad man in a cardigan who gives the impression of having been here longer than the building itself. Whatever you're after, his face suggests he's probably got it out the back.
<<set _greet = [
'Sal looks up from a watch he\'s prying open. //"Browsing, or buying? It\'s all the same in here."//',
'Sal doesn\'t look up. //"Take your time. Everything in here already waited longer than you will."//',
'Sal tips his head at the shelves. //"All sorts today. People had a rough month."//'
]>>
<<= _greet.random()>>
<br><br>
''On the shelves''
<br>
/* STOCK. Append an entry to add an item. Each needs:
flag - the $items key it sets to true on purchase
label - link text
price - cost in dollars
desc - what the player sees
patter - Sal's line about it
Items the player already owns drop out of the list automatically. */
<<set _stock = [
{
flag: "pc",
label: "Desktop computer",
price: 250,
desc: "A desktop tower with a flat monitor, a few years old but wiped clean and humming quietly at the end of the counter.",
patter: "Belonged to a kid who was going to be a streamer. They're all going to be a streamer. Runs fine, I checked it myself."
},
{
flag: "yogaMats",
label: "Set of yoga mats",
price: 60,
desc: "A pair of foam yoga mats, rolled up and barely scuffed.",
patter: "A lady buys these off me every January and sells them back every February. This year she didn't even make it to February."
}
]>>
<<set _anyStock = false>>
<<for _i = 0; _i < _stock.length; _i++>>
<<if not $items[_stock[_i].flag]>>
<<set _anyStock = true>>
<<capture _i>>
<<= _stock[_i].desc>>
<br>
//"<<= _stock[_i].patter>>"//
<br>
<<if $money >= _stock[_i].price>>
<<link `_stock[_i].label + " ($" + _stock[_i].price + ")"` "Eastgate Pawnbroker">>
<<set $items[_stock[_i].flag] = true>>
<<set $money -= _stock[_i].price>>
<</link>>
<<else>>
//<<= _stock[_i].label>> ($<<= _stock[_i].price>>), but you're short.//
<</if>>
<br><br>
<</capture>>
<</if>>
<</for>>
<<if not _anyStock>>
Sal spreads his hands. //"Nothing else here you need right now. Come back when you've worn something out."//
<br><br>
<</if>>
/* SELLING (future): a second loop here over a sellable-inventory list,
paying out a fraction of value and clearing the $items flag, would slot
in cleanly. Sal already buys as well as sells in the fiction. */
<<link [[Back out to the plaza.|Eastgate Plaza]]>><</link>><h2><<print passage()>></h2>
A strip mall off the access road, the kind of place that was somebody's idea of progress back when the highway was new and has been managing decline ever since. A shuttered bakery, a barber that's only ever open when you don't need one, a laundromat with a hand-taped sign about the machines. At the end, lit a little too brightly, sits Karim's Liquor. Past it, a windowless bar called the Anchor with the blinds always down.
<<switch $time>>
<<case 0>>Early morning. The gates are mostly down. A man hoses the sidewalk outside the laundromat, more out of ritual than effect.
<<case 1>>Late morning. The liquor store is open, a delivery half-unloaded across its doorway. Two retirees share a bench and a thermos.
<<case 2>>Midday. The lot is as busy as it gets, which isn't very. Someone's stroller is parked outside the bakery that isn't a bakery anymore.
<<case 3>>Early afternoon. The light's flat and the stores are quiet. The barber's chair sits empty behind the glass.
<<case 4>>Late afternoon. School's out somewhere nearby; kids drift across the lot in twos and threes, eyeing the liquor store they can't get served in.
<<case 5>>Early evening. The gates are coming down one by one. Karim's is still lit, the last of the trade trickling in.
<<case 6>>Evening. Most of the plaza has pulled its gates down, but Karim's stays lit at the end of the row, the Anchor's blinds glowing past it.
<<case 7>>Late evening. The storefronts are dark. The Anchor's the only thing still open, and it isn't asking to be looked at.
<<case 8>>Night. The lot is empty and half-lit, the kind of place you cross quickly or not at all.
<</switch>>
<br><br>
/* Liquor store: wine for the evening */
<<if $time <= 6>>
Karim's is open. A decent bottle of wine runs $20.
<br>
<<if $money >= 20>>
<<link "Buy a bottle of wine. ($20)" $return>>
<<set $money -= 20>>
<<set $items.wine += 1>>
<</link>>
<<else>>
//A bottle's $20, but you're short.//
<</if>>
<<else>>
//Karim's has pulled the gate down for the night.//
<</if>>
<br><br>
Sal's Pawn & Loan sits at the end of the row, its window crammed with other people's misfortune.
<br>
<<if $time <= 6>>
<<link [[Step into Sal's.|Eastgate Pawnbroker]]>><</link>>
<<else>>
//Sal's has the shutters down for the night.//
<</if>>
<br><br>
The Anchor sits at the dark end of the row, blinds down, a muffled thump of jukebox bass leaking out under the door.
<br>
<<if $time >= ($weekday >= 6 ? 2 : 4)>>
<<link [[Push into the Anchor.|The Anchor]]>><</link>>
<<elseif $weekday >= 6>>
//The Anchor opens by noon on weekends, but it's too early yet.//
<<else>>
//On a weekday the Anchor doesn't open its doors until the afternoon.//
<</if>>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>><h1>Game Over</h1>
<<switch $gameOverCause>>
<<case "divorce">>
You wake to the flat already changed. The hall is clearer than it has been in months, the boxes that never got unpacked packed again, by the door this time instead of against the wall.
<br><br>
$wife.name is dressed. Your son is dressed. There's a suitcase, and a smaller bag for him, the one with the cartoon zip he picked out himself.
<br><br>
She doesn't shout. That's the part that tells you it's real. The shouting was when there was still something to fight for.
<br><br>
<<speech "Wife" $wife.name>>
I gave it everything I had, longer than I should have. I kept waiting for the man I married to walk back through that door, and he didn't, and I can't keep teaching our son that this is what a marriage looks like.
<</speech>>
<br><br>
She tells you where she'll be. She tells you you'll still see him, that she would never take that from either of you. She is kind about it, in the careful way of someone who decided a long time ago and has run out of anger to spend.
<br><br>
Then she lifts the boy onto her hip, and he waves at you over her shoulder, not understanding, and the door closes, and the flat is very quiet.
<br><br>
You didn't earn it back. You ran out of time to try.
<<case "rent">>
The eviction notice arrived this morning. $wife.name didn't say much. You suspect she's been packing for days.
<br><br>
You stand in the entryway with a duffel bag at your feet, the home behind you already half-empty. The street outside is bright and indifferent.
<br><br>
You failed.
<<default>>
Whatever you were trying to rebuild has come apart in your hands. You didn't get there in time.
<</switch>>
<br><br>
<<link "Start over">>
<<script>>Engine.restart()<</script>>
<</link>><h2><<print passage()>></h2>
<<include 'Helion Dynamics, Description'>>
<<include 'Helion Dynamics, Triggers'>>
<<include 'Helion Dynamics, Basics'>>
<br><br>
<<link [[🏠 Go home|Living Room]]>><</link>>/* Desk */
<<if !$job.attendedToday>>
Your desk waits in the third row from the window — monitor dark, keyboard slightly crooked from the cleaner.
<<else>>
Your desk sits as you left it after clocking in — monitor dimmed, chair shoved back at an angle, the day's work already behind you.
<</if>>
<br>
/* Clock in */
<<if !$job.attendedToday>>
<<if $time < 2>>
<<if $job.promotionPending>>
<<link [[Sit down and start the day.|Helion Dynamics, Promotion]]>><</link>>
<<else>>
<<link [[Sit down and start the day.|Helion Dynamics, Workday]]>><</link>>
<</if>>
<<else>>
//You're too late. The workday has already moved on without you.//
<</if>>
<<else>>
//You've already put in your hours today.//
<</if>>/* Base description */
The Helion Dynamics office occupies a single floor of a glass-and-steel tower off the bypass. Open-plan rows of desks stretch toward the windows, broken up by glass-walled meeting rooms and a bank of vending machines. The carpet is the color of cold coffee, and the air has the still, recycled quality of a building whose windows haven't opened in years.
/* Time */
<<switch $time>>
<<case 0>>Early morning. The floor is empty, the cleaners long gone and the first arrivals not yet through the door.
<<case 1>>Late morning hum of keyboards, low voices, the occasional cough. Most desks are filled, screens deep in spreadsheets and Slack threads.
<<case 2>>Midday slump. Half the floor is at lunch; the other half is pretending to work while they wait their turn.
<<case 3>>The early afternoon drags, the post-lunch lull settling thick over the rows of desks.
<<case 4>>Late afternoon, and the floor is thinning out. Coats come off the backs of chairs, monitors blink to lock screens.
<<case 5>>Early evening. The windows turn orange. A few desks are still occupied by the keen, the desperate, and people avoiding home.
<<case 6>>The office is mostly dark. Cleaning staff move between empty desks; a monitor or two still glows.
<<case 7>>Late evening. The floor is silent, the cleaners gone, only a security light or two marking the long rows of desks.
<<case 8>>The office is closed for the night, locked behind keycard doors.
<</switch>>
<br><br><h2>Helion Dynamics</h2>
<<if $job.eventOutcome !== "">>
<div class="char-scene">
<img @src="$job.sceneGif" class="char-img">
<div class="char-text">
<<= $job.sceneText>>
</div>
</div>
<</if>>
<<if $job.drainType == "late" and not $job.stayedLate>>
<<link "Head back to your desk." "Helion Dynamics, Workday">>
<<set $job.eventOutcome = "">>
<</link>>
<<else>>
<<link "Head out." $return>>
<<set $job.eventOutcome = "">>
<</link>>
<</if>><<clockIn>>
<<set _oldTitle = $job.title>>
<<applyPromotion>>
<h2>Helion Dynamics</h2>
<<switch $job.level>>
<<case 2>>
A few minutes after you sit down, your manager leans over the partition and asks if you've got a second. In the break room he tells you the payment-flow fix from a few weeks back traveled further up than you'd realized, and that someone finally noticed whose name was on the original commit. It isn't a speech. It's a sentence and a handshake. But by the time you're back at your desk, your title in the directory has changed, and so has the number on your payslip.
<<case 3>>
You're called into one of the glass rooms before you've even opened your laptop. A director you've spoken to maybe twice slides a revised contract across the table and tells you the team needs someone senior who can be trusted with "the quieter work." You don't ask what that means. You sign where she points. On the way out she mentions, lightly, that your keycard will get you a little further into the building now.
<<case 4>>
They take you up a floor this time. The lift won't even stop there without your new card. The desks are quieter, the screens angled away from the door, and nobody introduces themselves. Your new manager walks you past a row of offices and into one with your name already on a label by the door. He calls you Lead, shakes your hand, and tells you the clients up here pay better because they ask for more. You spend the rest of the day learning what "more" looks like, and trying not to think too hard about it.
<<case 5>>
There's no meeting room this time, just a corner office and a man you've only ever seen in all-hands recordings. He pours you a drink you don't want and tells you you've earned a seat at the table. Then he tells you what the table actually does. The unnamed clients have names now. Project Kestrel has a purpose. You understand, finally, why the floor below isn't allowed up here. You take the title. You take the money. You tell yourself you'll work out the rest later.
<</switch>>
<br><br>
<span class="good">Promoted: $job.title. New pay: $<<print $job.wage>> per day.</span>
<br><br>
<<link 'Clock out for the day.' $return>><</link>>/* Break room sighting: rolled once per game day, consumed on view. */
<<if $job.breakRoomRollDay !== $gameDay>>
<<set $job.breakRoomRollDay = $gameDay>>
<<set $job.breakRoomToday = (random(1, 100) <= 35)>>
<</if>>
/* Break room ambient sighting: shows once, consumes the day's roll, +1 arousal */
<<if $job.breakRoomToday and $time >= 1 and $time <= 5>>
<<set $job.breakRoomToday = false>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set _internImg = "images/characters/npc/office_intern" + random(1, 8) + ".jpeg">>
<<set _breakLines = [
"One of the interns is at the coffee machine when you duck into the break room, stretched up on her toes to reach the good mugs on the high shelf. She gives you a quick smile over her shoulder and goes back to it.",
"An assistant is bent at the little fridge, sorting her lunch from everyone else's, the line of her skirt drawn tight as she leans. She straightens when she hears you and holds the door of it open in offer.",
"An intern is perched on the edge of the counter, phone in hand, one heel hooked on the cupboard below, skirt riding where she isn't thinking about it. She glances up, unbothered, and looks back down.",
"The break room is empty but for an assistant doing something complicated to the coffee machine, sleeves pushed up, blouse pulled loose from the reach. She blows the hair out of her face and asks if you know how the filter comes out. You don't.",
"An intern is at the water cooler as you come in, tipping her head back for the little paper cup, the long line of her throat and everything under it caught in the strip lighting. She crushes the cup, drops it, and is gone before you've quite collected yourself."
]>>
<div class="char-scene">
<img @src="_internImg" class="char-img">
<div class="char-text">
<<= _breakLines.random()>>
<span class="arousal">Arousal increased.</span>
</div>
</div>
<</if>><<clockIn>>
<h2><<print passage()>></h2>
/* Pick a description set based on job title */
<<switch $job.title>>
<<case "Junior Software Engineer">>
<<set _descriptions = [
"You spend the morning chasing a bug in a payment flow nobody above your pay grade wants to touch. The original author left before you arrived and half the comments are in a language you don't read. By lunch you've narrowed it to a single function older than the company's current logo. You patch it, push the fix, and watch a senior carry it into a meeting you weren't invited to. Your name isn't on the ticket when it closes.",
"A queue of small, unglamorous fixes eats the morning. A man with a visitor badge and a government-issue lanyard comes down from a floor your card won't open, hands a team lead a sealed drive, and is gone before anyone introduces him. You go back to a date-format bug on a dashboard whose client is listed only as a contract number. You've never once seen a client's actual name written down in this building.",
"The planning meeting opens with the quarterly slogan and a slide of numbers nobody explains. Renewals up. A new 'defense and analytics' line that wasn't there last quarter. Your team is asked to absorb a small additional scope from a division you've never been told the function of, with no extra headcount. The afternoon disappears into unit tests for a service whose purpose was described to you in one sentence and a non-disclosure agreement.",
"A senior pulls you into pair programming on something that has a code instead of a name. He explains the function he needs and refuses to explain what it feeds, then closes the repo the moment you stand up. In the second you saw it, the folder tree read like the inside of a missile: guidance, telemetry, payload. You write the function. It's clean work. You don't ask.",
"The printer eats your architecture diagrams again. You wrestle the tray open and somehow knock half your coffee across your pants in the process. The intern, newer than you and already less impressed, watches without comment. You spend the rest of the day in a damp brown stain and the smell of stale espresso, fixing a parser written by someone since promoted above you.",
"You build a small internal tool a senior architect demanded by message at 2 a.m. Before lunch the same architect says it's been deprioritized, please disregard. Your branch sits untouched. By the time you log off, the architect is asking someone else for something new with the same urgency, in the same channel, and you notice that nobody here ever explains why a thing is wanted, only how fast."
]>>
<<case "Software Engineer">>
<<set _descriptions = [
"You own real tickets now, your name on them from the start. This morning you trace a data pipeline you maintain back toward its source and find it doesn't begin inside the company at all. The records arrive pre-collected, from a vendor named like a law firm, already tagged by location and device and movement. You were told you were cleaning the data. You were never told it was gathered from people who don't know the company exists.",
"You get partial read access to the unnamed program. The fragments you saw as a junior have a shape now: ingestion, then enrichment, then a stage called matching that cross-references one dataset against another you aren't cleared to open. The inputs are phone identifiers and coordinates from places that turn up in the news with the word conflict attached. You write your part well, and try not to follow the arrow past the edge of your access.",
"A standup runs long over a slipped client deliverable. Nobody says the client. The deliverable is described purely in capability: what it can find, how fast, at what confidence, from how little. You catch yourself genuinely absorbed in the problem, sketching the architecture in your notebook, before you remember to wonder who is on the other end of the word 'find.'",
"You're loaned to a sister team to help untangle a build issue, and their work isn't software at all, or not only. There's hardware in their lab behind glass, components for something that flies, schematics stamped with an export-control warning you have to sign just to stand near. You fix their build. You understand almost nothing of what you saw, and you suspect that separation is the entire point of how this place is laid out.",
"Your manager takes you for the kind of coffee that means something. He says you're trusted now, that the people upstairs like that you don't ask questions that slow things down. He means it warmly and you take it warmly, the small clean hit of being seen. It's only on the walk back to your desk that the sentence turns over in your head and shows you its other side."
]>>
<<case "Senior Software Engineer">>
<<set _descriptions = [
"Your card reaches the floor above now and most days you have reason to use it. The quieter work lives up here. Today it's a tuning pass on the matching engine: feed it a fragment of a person, a number, a face, a pattern of movement, and it returns the rest, where they are, who they're near, where they'll likely be next. You're told it keeps clients safe. You stopped believing the things you're told and kept building them anyway, cleanly, on time.",
"A client escalation reaches you stripped of every name on its way down. What's left is a complaint that the system locates its subjects too slowly under load, in a region currently thick with soldiers and reporters. You spend the day making it faster. You're good at it. The better you make it, the more clearly you see that the skill and the unease are the same muscle, and only one of them gets you paid.",
"You sit in a review for a capability that has no name, only a spec, and you finally ask the question you keep swallowing: what happens to the output once it leaves us. The room goes politely quiet. The director who recruited you smiles and says the architecture is sound, let's stay focused. You stay focused. But you clocked who looked down at the table when you asked, and who looked at you, and the second list was the shorter one.",
"Half the floor up here isn't even your discipline. One group does nothing but locate, work commissioned by people with no business cards and email addresses that are mostly numbers. Another group's deliverables physically leave the building in crates. The official line is that the company merely finds things and builds things, and what the clients do afterward is a question above everyone's clearance, including, conveniently, the people asking.",
"You walk two mid-levels through their first work on the program, telling them only what they need and closing the repo when they stand up, exactly the way it was once done to you. One asks what the matching is for. You give the answer you were given. You watch them decide whether to push, and watch them decide not to, and you understand the machine a little better than you did at breakfast. It runs on people choosing not to finish the question."
]>>
<<case "Lead Engineer">>
<<set _descriptions = [
"You run a team on the floor above now, and in the rooms you're allowed into the clients have names. The names are worse than the silence was. This morning you sit across a table from people who speak about a population the way you once spoke about edge cases, and you translate what they want into a sprint plan. By the time you leave the room it's just engineering again. That's the only trick you've found for staying in the chair.",
"A new contract: a consumer technology company everyone has heard of wants a surveillance layer built quietly enough that it never surfaces in a product announcement. They have the users. They lack the stomach to build the watching themselves, so they pay you to, at arm's length, through a subsidiary with a clean and meaningless name. You scope it. It's elegant. You hate how elegant you can make it.",
"Budget season. The capability you helped build is presented as a growth line, and executives discuss expanding the locating service into a new market the way they'd discuss a feature flag. You're asked for an engineering estimate. You give an honest one. It's a good number, and it earns you a nod from a man whose name you now know and wish you didn't, and the approval lands somewhere in you that you'd rather it had missed.",
"An incident pulls you in before dawn. The system surfaced someone it shouldn't have, or surfaced them to the wrong client, and which of those it was changes nothing about the cleanup. You spend the day making it never have happened: no ticket, no postmortem anyone off this floor will read. As finally you get up from your desk, you can't recall the last conversation you had that wasn't about containment.",
"A junior on the floor below, the kind you used to be, sends a careful message asking to be considered for the program. They think it's the interesting problem. They're right, it is. You sit with the message a while. Then you reply that you'll keep them in mind, and you mean it, and the fact that you mean it is the part that rides home with you."
]>>
<<case "Engineering Manager">>
<<set _descriptions = [
"You don't write much code now. You manage the people who do, and the thing they build carries your design even when your hands are nowhere near it. Today is one-on-ones, six of them, each engineer sharp and earnest and a little proud, none of them holding the whole picture. You hold it. Six times you decide how much to hand over, and six times you decide on less, and you tell yourself it's mercy.",
"A seat at the table, the corner office, the calm register where the real decisions get made. A client wants something that crosses a line even this place mostly pretends to keep: locating done inside a country the company isn't supposed to operate in, for a private outfit that fields its own soldiers. You contribute, usefully, because that's what the seat is for. Far below, on the floor you started on, someone is fixing a date-format bug and has no idea you exist.",
"Headcount review. You decide who gets pulled up to this floor and who stays below, which means you decide who learns what the company actually is and who is spared it. You choose the ones who can carry it, you tell yourself, but you know you're really choosing the ones who won't ask. You can read the difference at a glance now. That instinct used to be the thing you most disliked about the people who once sat where you sit.",
"A reporter's email lands in your inbox, forwarded down with a single word: handle. The questions are close. Closer than anyone above you seems to believe, brushing against clients that span a foreign ministry, a domestic agency that doesn't advertise its address, and a technology company the public adores. You spend the day drafting a non-answer in the careful, capable language you taught yourself to write. You were going to build something everyone heard about. You did. They'll just never know it was yours.",
"A quiet day at the top, which has its own strangeness. In the afternoon you walk the floor below, the one with the carpet the color of cold coffee, and a junior you don't recognize gives you the wary nod people save for someone from upstairs. You remember being that nod. You remember the man who sat at that desk before the weight and the lost savings and the seat at the table. You take the lift back up. The card still works."
]>>
<<default>>
<<set _descriptions = [
"The workday passes."
]>>
<</switch>>
<<print _descriptions.random()>>
<br><br>
/* Worked with too high arousal */
<<if $job.distractedToday>>
<span class="warning">Your head wasn't in it today. It's like you're just too horny to focus.</span>
<br><br>
<</if>>
/* Passive drain: flavor only, the energy hit already landed in clockIn.
Lines split by seniority so a Lead isn't shifting desks. */
<<if $job.drainType == "passive">>
<<if $job.level >= 4>>
<<set _drainLines = [
"A client escalation with no name on it swallows the afternoon, three back-to-back calls where you say the same reassuring nothing in three different registers. You leave wrung out.",
"You spend hours you'll never recover chairing a 'quick alignment' between two teams who despise each other, translating each side's contempt into something the other can sign off on.",
"A junior's mistake lands on your desk to make disappear before anyone above notices. No ticket, no thanks, just a long quiet afternoon of cleanup and a headache to take home.",
"Budget review runs three hours over. By the end you've defended headcount you don't care about to people whose names you're still not sure of, and there's nothing left in the tank."
]>>
<<else>>
<<set _drainLines = [
"Half the afternoon vanishes into helping shift the whole row of desks two meters left for a floor plan nobody asked for. You leave with your back complaining and nothing to show for it.",
"You get volunteered to onboard a new hire who asks the same three questions in rotation until the light outside has gone.",
"A senior dumps a merge conflict on you an hour before end of day, the kind with someone else's undocumented mess all through it. You untangle it, uncredited, long past when you meant to leave.",
"IT reimages your machine mid-morning and you spend the rest of the day reinstalling everything from scratch, achieving precisely nothing anyone will ever see."
]>>
<</if>>
<<run _drainLines.push(
"A production incident eats the day. By the time it's contained you've forgotten what you actually came in to do.",
"A server migration goes sideways and you spend hours babysitting a progress bar that keeps resetting to zero."
)>>
<<= _drainLines.random()>> <span class="bad">You're extra worn out from working today.</span><br><br>
<</if>>
/* Workday opportunity, surfaced under the day's description */
<<if $job.eventToday>>
<<if $job.level >= 4>>
<<set _mode = "participant">>
<<elseif $job.level == 3>>
<<set _mode = "complicit">>
<<else>>
<<set _mode = "witness">>
<</if>>
/* Shared gif pool. Each type carries only the tiers it actually supports.
Omit a tier entirely (or leave its array empty) and it drops out of the
pool automatically for that mode. No empty-string placeholders. */
<<set _office = {
bj: {
gifs: ["office_bj1.gif","office_bj2.gif","office_bj3.gif","office_bj4.gif","office_bj5.gif","office_bj6.gif","office_bj7.gif","office_bj8.gif","office_bj9.gif"],
texts: {
witness: ["A quick peek through the doorway reveals the assistant kneeling beside the chair, the executive gripping the armrests with a strained smile.", "You glance inside and immediately look away again as the woman under the desk keeps her boss far too distracted to notice you."],
complicit: ["You step into the office to ask a question and stop cold when you realize the intern's hand is already busy beneath the desk.", "The executive barely looks up as you open the door, too occupied with the woman kneeling between his legs to care.", "You open the private office expecting a meeting and instead find the secretary on her knees while her boss exhales sharply above her.", "The door clicks open, and for one stunned second, everyone freezes except the woman already wrapped around him."],
participant: ["You lead the assistant into the vacant corner office, where the day's pent up tension is finally relieved.", "You lock the office door behind the intern, and drop into a chair while explaining what you need her to do.", "You close the office door behind the assistant, and she gives you a teasing smile before slowly sinking to her knees."]
}
},
grope: {
gifs: ["office_gr1.gif","office_gr2.gif","office_gr3.gif"],
texts: {
witness: ["Through the half-open blinds, you catch the manager pressed against his intern while wandering hands slip beneath her clothing.", "You pause outside the office door just long enough to see a manager tangled close to his intern. He hushes her while cupping a feel."],
complicit: ["The moment the door opens, both of them turn toward you without stopping, her blouse still half undone beneath his hands.", "You pause outside the office door just long enough to see a manager tangled close to his intern."]
/* no participant tier: grope stays an ambient sighting, not an arousal vent */
}
},
sex: {
gifs: ["office_h1.gif","office_h2.gif","office_h3.gif","office_h4.gif","office_h5.gif","office_h6.gif"],
texts: {
witness: ["The conference room lights are dim, but not enough to hide the rhythm of two bodies moving against the polished table.", "You freeze outside the office when you spot an intern with her executive partner, papers scattered across the floor beneath them."],
participant: ["The empty office stays quiet except for muffled gasps and the creak of office furniture as you pull the intern closer.", "You lead the assistant into the vacant corner office, where the day's pent up tension is finally relieved."]
/* no complicit tier */
}
},
hj: {
gifs: ["office_hj1.gif"],
texts: {
witness: ["A quick peek through the doorway reveals the assistant kneeling beside the chair, the executive gripping the armrests with a strained smile.", "You glance inside and immediately look away again as the woman under the desk keeps her boss far too distracted to notice you."],
complicit: ["You step into the office to ask a question and stop cold when you realize the intern's hand is already busy beneath the desk.", "The executive barely looks up as you open the door, too occupied with the woman kneeling between his legs to care."],
participant: ["You lock the office door behind the intern, and drop into a chair while explaining what you need her to do.", "The intern kneels beside your desk in the empty office, looking up at you while her hand slowly slides higher."]
}
}
}>>
/* Tease pool per tier */
<<switch _mode>>
<<case "witness">>
<<set _pool = [
{id:"w1", teaseImg:"", setup:"You catch a sound from an office down the hall that doesn't belong in a workplace."}
]>>
<<case "complicit">>
<<set _pool = [
{id:"c1", teaseImg:"", setup:"A door on the quiet floor sits open a crack, and there's movement behind it."}
]>>
<<case "participant">>
<<set _internImg = "images/characters/npc/office_intern" + random(1, 8) + ".jpeg">>
<<set _internLines = [
'//"Did you need anything else from me?"//',
'//"Anything else before I head off?"//',
'//"Is there something else you wanted?"//',
'//"Do you need me for anything else?"//',
'//"Was there anything else?"// she asks, lingering.',
'//"Anything else you need?"// she says, not quite turning to leave.'
]>>
<<set _pool = [
{id:"p1", teaseImg:_internImg, setup:"An assistant lingers in the doorway after dropping off some files. " + _internLines.random()}
]>>
<</switch>>
<<if _pool.length > 0>>
<<set _scene = _pool.random()>>
<<if _pool.length > 1>>
<<for _i = 0; _scene.id === $job.lastWorkScene and _i < 5; _i++>>
<<set _scene = _pool.random()>>
<</for>>
<</if>>
<<set $job.lastWorkScene = _scene.id>>
/* Tease only. Payoff withheld until the player engages. */
<<if _scene.teaseImg !== "">>
<div class="char-scene">
<img @src="_scene.teaseImg" class="char-img">
<div class="char-text"><<= _scene.setup>></div>
</div>
<<else>>
<<= _scene.setup>>
<</if>>
<br>
<<set _validTypes = Object.keys(_office).filter(t =>
_office[t].texts[_mode] && _office[t].texts[_mode].length > 0
)>>
<<if _mode === "participant">>
<<link "Take her to an empty office." "Helion Dynamics, Event">>
<<set $job.eventToday = false>>
<<set $arousal = Math.max($arousal - 3, 0)>>
<<addSuspicion 2>>
<<set _t = _office[_validTypes.random()]>>
<<set $job.sceneGif = "images/h/office/" + _t.gifs.random()>>
<<set $job.sceneText = _t.texts[_mode].random()>>
<<set $job.eventOutcome = "engaged">>
<</link>>
<<else>>
<<link "Take a closer look." "Helion Dynamics, Event">>
<<set $job.eventToday = false>>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set _t = _office[_validTypes.random()]>>
<<set $job.sceneGif = "images/h/office/" + _t.gifs.random()>>
<<set $job.sceneText = _t.texts[_mode].random()>>
<<set $job.eventOutcome = "watched">>
<</link>>
<</if>>
<br><br>
<</if>>
<</if>>
/* Stay-late choice: accept for performance, decline for a nick to it.
Weekday version is career-only, no wife penalty by design. */
<<if $job.drainType == "late" and not $job.stayedLate>>
<<if $job.level >= 4>>A crisis lands at end of day and the room quietly expects you, of all people, to be the one who stays until it's put to bed.<<else>>Your manager catches you reaching for your coat. There's a deadline slipping, and he's asking, in the way that isn't really asking, if you can stay and see it through.<</if>>
<br>
<<if $energy >= 1>>
<<link "Stay late and grind it out." "Helion Dynamics, Workday">>
<<set $job.stayedLate = true>>
<<set $job.drainType = "">>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $job.performance += 1>>
<</link>>
<br>
<<else>>
//You're running on empty. You couldn't give it another hour if you wanted to.//
<br>
<</if>>
<<link "Come up with a bad excuse and leave." $return>>
<<set $job.drainType = "">>
<<set $job.performance -= 1>>
<</link>>
<</if>>
<<if not ($job.drainType == "late" and not $job.stayedLate)>>
<<link "Clock out for the day." $return>><</link>>
<</if>><br><br>
''Elsewhere in the house''
<br>
<<if !tags().includes("bedroom")>>
<<link [[🛏️ Bedroom|Bedroom]]>><</link>><<if $wife.location == "bedroom">> 👩🦰<</if>>
<br>
<</if>>
<<if !tags().includes("kitchen")>>
<<link [[🍳 Kitchen|Kitchen]]>><</link>><<if $wife.location == "kitchen">> 👩🦰<</if>>
<br>
<</if>>
<<if !tags().includes("livingroom")>>
<<link [[🛋️ Living Room|Living Room]]>><</link>><<if $wife.location == "livingroom">> 👩🦰<</if>>
<br>
<</if>>
<<if !tags().includes("bathroom")>>
<<if $wife.location == "bathroom">>
<<link [[🚿 Bathroom|Bathroom Door]]>><</link>> 👩🦰
<<else>>
<<link [[🚿 Bathroom|Bathroom]]>><</link>>
<</if>>
<br>
<</if>>
/* Only show "Around town" when it makes sense */
<<if $time < $timeMax>>
<br>
''Around town''
<br>
<<if $weekday <= 5 and $time == 1>>
<<link [[💼 Helion Dynamics|Helion Dynamics]]>><</link>>
<<if !$job.attendedToday>>
<span class="warning">- Time to work!</span>
<br>
<</if>>
<</if>>
<<link [[🏃 Canal Path|Canal Path]]>><</link>>
<br>
<<link [[🛒 Eastgate Plaza|Eastgate Plaza]]>><</link>>
<</if>><h1>Twelve Years Ago</h1>
The bleachers were full and you were watching the wrong half of the field. Down at the front, the cheer squad came out in formation, and one of them caught your eye and didn't look away. Blue and white. Red hair pulled tight. A smile that wasn't for the crowd.
<br><br>
She found you outside afterward, hair already coming loose. She said you looked like a guy who already knew how this story ended.
<br><br>
Her name was <<textbox "$wife.name" "Ashley">>.
<br><br>
You told her yours: <<textbox "$name" "Dave">>.
<br><br>
She was studying acting. You were on the boxing team and halfway through a computer science degree that bored you to tears. You were both broke in the temporary, beautiful way only college can make broke feel.
<br><br>
You talked through dinner with her friends and then through the long walk back to her dorm. She didn't tell you to leave at her door.
<br><br>
<div class="intro-image wide">
<img src="images/intro/intro1.jpeg" width="100%">
</div>
<br>
Sex came easy in those days, and often. She'd come back from practice still in her uniform and lock the door behind you.
<br><br>
You were going to do everything. She would be on a stage by twenty-five. You would build something everyone heard about. You said it out loud to each other in cheap apartments and on long drives and in the kitchens of friends who would later stop calling.
<br><br>
You believed every word of it. So did she.
<br><br>
<<link "Continue." "Intro 2">><</link>><h1>The Years Between</h1>
You graduated. She graduated. You took the job your professor told you to take, in a building that smelled of carpet glue, and you wrote code that nobody outside the company would ever see. She got headshots done. She auditioned for things and didn't get them, then auditioned for things and got them, mostly background work, mostly unpaid.
<br><br>
Three years in, you had an idea you couldn't stop thinking about, and you knew, the way you'd known at twenty, that it was the one.
<br><br>
You raised a little. Then a little more. You hired two people, then four, then six. The runway got longer. The pitch got tighter. You lost weight from skipped meals and slept on the office couch more nights than you slept at home.
<br><br>
$wife.name went to fewer auditions. Then to a callback she didn't get, and another, and another. She stopped telling you about them.
<br><br>
She told you about the baby on a Tuesday. You remember it was a Tuesday because you had a board meeting on the Wednesday. You bought the house that summer. A small place with trees in the front yard, blocks from a park where she pictured pushing a stroller. $wife.name picked it. She said it had good light.
<br><br>
The baby came. You met your investors that morning. You held your son that afternoon. You were back at the office before he was a week old.
<br><br>
The startup had eighteen months left in it. You spent ten of them telling yourself the next quarter was the one. $wife.name took your son to his first doctor's appointment, and his second, and his first day at a daycare you couldn't afford and signed up for anyway. You don't remember what she looked like in any of those months. You weren't really there.
<br><br>
<div class="intro-image wide">
<img src="images/intro/intro2.jpeg" width="100%">
</div>
<br>
The company went under in a way you'd watched other people's companies go under. You'd always thought you'd see it coming. You didn't.
<br><br>
When the dust cleared, the savings were gone, the house was gone, and your son was almost two and didn't really know you.
<br><br>
$wife.name didn't say much. There was nothing to say.
<br><br>
<<link "Continue." "Intro 3">><</link>><h1>Now</h1>
The apartment is small. Two bedrooms, if you're generous about what a bedroom is. The radiators clank. The neighbor upstairs has a child the same age as your son, and you can hear both of them most mornings, before the kettle is on. Half the boxes are still in the hallway.
<br><br>
<div class="intro-image wide">
<img src="images/intro/intro3.jpeg" width="100%">
</div>
<br>
You took the job at Helion Dynamics six weeks ago. Junior Software Engineer. A hundred a day. You sit in row three of an open plan office in a building off the bypass, and you write code for things you don't understand for clients you've never been told the names of. The carpet is the color of cold coffee. You aren't allowed onto the floor above.
<br><br>
$wife.name now works as a waitress, feeling like the cliché of a failed actress. Daycare costs more than her shifts pay. The math doesn't work, and you both pretend not to notice.
<br><br>
You've put on thirty pounds. You can feel it on the stairs and in the mirror. The boxing gloves you used to own are in a box somewhere, or they aren't. You haven't looked yet.
<br><br>
Rent is due Sunday. The fridge is mostly empty. Your son will be home from daycare at five.
<br><br>
It is Monday morning. You should be on your way to work in an hour.
<br><br>
You haven't decided yet whether this is the rest of your life. Maybe it is. Maybe it's just the bottom, and the bottom is only the bottom if you stay there.
<br><br>
Nobody is going to hand you the way back. Whatever you want from here, the money, her trust, your own reflection, you take it the hard way or not at all.
<br><br>
You earn it.
<br><br>
<<link "Begin." "Bedroom">>
<<set $gameRunning to true>>
<</link>><h2><<print passage()>></h2>
<<include 'Kitchen, Description'>>
<<include 'Kitchen, Triggers'>>
<<include 'Kitchen, Basics'>>
<<include 'House, Transport'>>/* Cooking State */
<<if $chores.kitchen>>
The countertop is clear, utensils set within easy reach.
<<else>>
The counter is cluttered, tools and dishes left where they were used.
<</if>>
/* Weekend late-morning breakfast together (both in the kitchen) */
<<if $weekday >= 6 and $time == 1 and $wife.location == "kitchen">>
<br>
<<if $wife.mood < 0>>
//$wife.name is making her own breakfast, and the set of her shoulders says she'd rather do it alone.//
<<elseif $energy < 1>>
//You're too drained to put a proper breakfast together.//
<<else>>
<<link "Make a slow weekend breakfast together." $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<moodShift 1>>
<<careCredit>>
<</link>>
<</if>>
<</if>>
/* Cook (Early Evening only) */
<<if $time == 5>>
<br>
<<if $energy < 1>>
//You're too drained to cook dinner.//
<<else>>
<<link "Cook dinner for everyone." $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $wife.cookedToday = true>>
<<moodShift 1>>
<<careCredit>>
<</link>>
<</if>>
<<elseif $time > 5>>
<br>
//Dinner's long done. Nothing to cook now.//
<<elseif $time > 0 and not ($weekday >= 6 and $time == 1)>>
<br>
//Too early to start on dinner.//
<<elseif $time == 0 and $weekday >= 6>>
<br>
//Too early to think about food.//
<</if>>
/* Eat together (weekday mornings) */
<<if $time == 0 and $weekday <= 5>>
<br>
<<link "$wife.name has made breakfast. Eat together." $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<moodShift 1>>
<<careCredit>>
<</link>>
<</if>>/* Base description */
A modest kitchen with a wooden table at its center and chairs around it. On the countertop, the coffee maker sits beside the kettle. The fridge hums quietly. A window above the sink looks out onto the backs of the apartments across the way.
/* Time */
<<switch $time>>
<<case 0>>Early morning light spills across the counter, catching on the rim of an empty mug left from the night before.
<<case 1>>Late morning settles into the kitchen, the smell of coffee still faint in the air, a sippy cup drying upside down by the sink.
<<case 2>>Midday sun rests flatly on the table, the room quiet and still.
<<case 3>>The afternoon hangs heavy and still, dust turning slowly in the light by the window.
<<case 4>>Late afternoon warms the table in tired gold, the light over the building across the way slowly thinning.
<<case 5>>Early evening softens the kitchen, the light through the window turning amber on the apartments across the way.
<<case 6>>Evening settles over the kitchen, the overhead light catching the smell of dinner lingering in the air.
<<case 7>>Late evening settles over the block, the windows opposite dark but for one or two still lit.
<<case 8>>Night presses against the window, the block dark beyond the glass, and the kitchen feels smaller under the overhead light.
<</switch>>
/* Chore */
<<if $chores.kitchen>>
<span class="good">The counters are wiped down, dishes put away, the table cleared.</span>
<<else>>
<span class="warning">Dishes sit stacked in the sink, a half-eaten toddler plate among them, and crumbs scatter the table where no one bothered to wipe.</span>
<</if>>
/* Kitchen Chore */
<<chore "kitchen" "Clean the kitchen.">>
<br><br><<if $wife.location == "kitchen">>
<div class="char-scene">
<img @src="either('images/characters/w/w_casualDay1.jpeg', 'images/characters/w/w_casualDay2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is here, moving around the counter. She glances over when you come in.
<<elseif $wife.mood == 0>>
$wife.name is here, moving quietly around the counter.
<<else>>
$wife.name is here, working at the counter without looking up.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "kitchen">><h2>With $wife.name</h2>
<<set $wife.lazyMorningToday = true>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<moodShift 1>>
<<careCredit>>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_lazymorning1.jpeg', 'images/characters/w/w_lazymorning2.jpeg','images/characters/w/w_lazymorning3.jpeg')" width="100%">
</div>
<br>
<<if $wife.relationship >= 50>>
You climb back under the covers and she folds into you without a word, her head on your chest, the morning in no hurry to start. For a while there's nothing to fix and nowhere to be, just her breathing slowing against you and the light moving across the ceiling.
<<elseif $wife.relationship >= 25>>
You slide back in beside her and she lets you, settling her back against your chest. Neither of you says much. It's easy in a way mornings haven't been in a while, and she doesn't pull away though the boy could wake any minute.
<<else>>
You get back under the covers and, after a moment, she shifts to make room rather than turning away. You lie there in the quiet, not talking, the small distance between you a little smaller than it was.
<</if>>
<br><br>
<<link "Get up." $return>><</link>><h2><<print passage()>></h2>
<<include 'Living Room, Description'>>
<<include 'Living Room, Triggers'>>
<<include 'Living Room, Basics'>>
<<include 'House, Transport'>>/* Relax */
The sofa faces the TV. Somewhere to sit and let an hour go by.
<br>
<<if $time >= $timeMax>>
//It's too late to properly unwind now.//
<<else>>
<<link "Pass some time in front of the TV.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<if random(1, 100) <= 50>>
<<goto "TV">>
<<else>>
<<goto $return>>
<</if>>
<</link>>
<</if>>
<br><br>
<<if $items.yogaMats>>
A pair of yoga mats rest in the corner, rolled out and ready.
<br>
<<workout "Do some yoga." 1 1 1 0 1>>
<<else>>
The corner stands empty, open space against the wall.
<br>
//You could use a set of yoga mats here, something simple for a quiet workout at home.//
<</if>>
<<soloVent "livingroom">>/* Base description */
A living room with a sofa facing the television and an armchair angled beside it. A coffee table sits in the middle, a low bookshelf against the far wall. A window looks out onto the street below.
/* Time */
<<switch $time>>
<<case 0>>Early morning light creeps across the floor, the room still and the television dark.
<<case 1>>Late morning settles into the room, a forgotten cartoon paused on the screen from the day before.
<<case 2>>Midday sun pools on the rug, the air warm and unmoving.
<<case 3>>The afternoon hangs heavy and still, sunlight catching the dust above the coffee table.
<<case 4>>Late afternoon stretches across the floor in long bars of gold, the room quiet and waiting.
<<case 5>>Early evening light fades from the street outside, the lamps not yet switched on.
<<case 6>>Evening settles over the room, a single lamp warm against the gathering dark.
<<case 7>>The late evening is slightly illuminated by the streetlamps.
<<case 8>>Night presses against the window, the room lit only by the soft glow of a single lamp.
<</switch>>
/* Chore State */
<<if $chores.livingroom>>
<span class="good">Cushions are straightened, toys put away, the coffee table clear.</span>
<<else>>
<span class="warning">Toys lie scattered across the rug, a blanket bunched on the sofa, mugs left ringing the coffee table.</span>
<</if>>
/* Living Room Chore */
<<chore "livingroom" "Tidy the living room.">>
<br><br><<if $wife.location == "livingroom">>
/* Wife doing yoga */
<<if $wife.doingYoga>>
<div class="char-scene">
<img @src="either('images/characters/w/w_yoga1.jpeg', 'images/characters/w/w_yoga2.jpeg', 'images/characters/w/w_yoga3.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name has the mats out, moving through her stretches in the cleared space by the wall. She catches you watching and carries on, unbothered by the audience.
<<elseif $wife.mood == 0>>
$wife.name has the mats out, working through her yoga by the wall, breathing slow and even.
<<else>>
$wife.name is on the mats with her back to you, moving through her stretches, making it plain she'd rather not be interrupted.
<</if>>
<<if not $wife.yogaViewedToday>> <span class="arousal">Arousal increased.</span><</if>>
<br>
<<if $wife.mood >= 0>>
<<if $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<br>
<<elseif $arousal >= 8>>
//You're in no state to focus on stretching beside her.//
<br>
<<elseif $energy < 1>>
//You're too drained to join in.//
<br>
<<else>>
<<link "Join her for a session." $return>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $fitness += 1>>
<<set $wife.relationship += 2>>
<<moodShift 1>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<</link>>
<br>
<</if>>
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<if not $wife.yogaViewedToday>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<<set $wife.yogaViewedToday = true>>
<</if>>
/* Wife Tidying */
<<elseif $wife.tidyToday>>
<<set $wife.tidyToday = false>>
<<set $arousal = Math.min($arousal + 1, $arousalMax)>>
<div class="char-scene">
<img @src="either('images/characters/w/w_casualBent1.jpeg', 'images/characters/w/w_casualBent2.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is gathering the kid's toys off the rug, bent over by the sofa with one arm buried beneath it, chasing something just out of reach.
<<elseif $wife.mood == 0>>
$wife.name is clearing the toys scattered across the rug, by the sofa with one arm stretched right under it after a stray one.
<<else>>
$wife.name is picking up after the kid, bent down by the sofa and reaching under it without a word to you, the set of her shoulders making it plain she'd rather you weren't watching.
<</if>>
<span class="arousal">Arousal increased.</span>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
There's a whole second toybox under here, I swear. Don't just stand there enjoying the view, lend me a hand.
<</speech>>
<<elseif $wife.mood == 0>>
<<speech "Wife" $wife.name>>
Why does everything end up under here. Every single time.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Don't mind me. Someone has to do it.
<</speech>>
<</if>>
/* Wife on the couch */
<<else>>
<div class="char-scene">
<img @src="either('images/characters/w/w_casualRelax1.jpeg', 'images/characters/w/w_casualRelax2.jpeg', 'images/characters/w/w_casualRelax3.jpeg', 'images/characters/w/w_casualRelax4.jpeg', 'images/characters/w/w_casualRelax5.jpeg')" class="char-img">
<div class="char-text">
<<if $wife.mood >= 1>>
$wife.name is on the couch. She looks up briefly when you come in.
<<elseif $wife.mood == 0>>
$wife.name is sitting on the couch.
<<else>>
$wife.name is on the couch, her eyes fixed somewhere across the room.
<</if>>
<<link [[Approach her.|Wife Interact]]>><</link>>
</div>
</div>
<</if>>
<<wifeReact>>
<</if>>
<<weekendOuting>>
<<exPing "livingroom">><h2>Her Place</h2>
<<addSuspicion 3>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set _gifs = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _gifs.push("ons" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/ons/' + _gifs.random()" width="100%">
</div>
<br>
<<set _scene = [
"You knock once and she opens the door without a word. Clothes come off fast. You push her against the wall, yank her jeans down, and drive your cock into her wet pussy in one hard thrust. She gasps and grabs your shoulders as you fuck her standing, hips snapping forward, skin slapping loud with every stroke. Her cunt grips you tight. A few minutes later in the bedroom, you bend her over the bed, and slam into her from behind, one hand fisted in her hair while the other works her clit. She moans and pushes back against your thrusts. You flip her onto her back, spread her legs wide, and pound deep, watching her tits bounce as your cock stretches her open. She claws your back and comes hard. You keep thrusting until you flood her insides. She lies there catching her breath while you pick up your clothes.",
"She buzzes you up, and clothes are already coming off as you move toward the bedroom. She drops to her knees the moment you reach the bed and takes your cock in her mouth. Her tongue works along the shaft while her lips slide up and down. She looks up once, then takes you deeper until you feel the back of her throat. After a few minutes she pulls off, climbs onto the bed, and straddles you. She grabs your cock, lines it up, and sinks down until you're buried inside her. Her hips start rolling, grinding and bouncing, her pussy gripping tight with every movement. She leans forward, hands on your chest, riding faster, her tits swaying above you. You grip her ass and thrust up to meet her, driving deeper each time she drops. She moans louder and slams down harder. Her cunt clamps around your cock as she comes. You keep thrusting from below until you can't hold back either. She stays on top for a moment, breathing heavy, then rolls off onto the sheets. You stand and start pulling on your clothes while she reaches for her phone."
]>>
<<= _scene.random()>>
<br><br>
<<link [[Slip out and head home.|Living Room]]>><</link>><h2>Round Two?</h2>
<<set $ex.pending = false>>
<<set $ex.day = $gameDay>>
/* She sends a picture with the text. Avoid an immediate repeat, save it. */
<<set _ons = []>>
<<for _i = 1; _i <= 8; _i++>>
<<set _ons.push("ons_phone_n" + _i + ".jpeg")>>
<</for>>
<<set _ons = _ons.filter(f => f !== $ex.lastNudeImg)>>
<<set _pick = _ons.random()>>
<<set $ex.lastNudeImg = _pick>>
<<set _img = "images/characters/npc/" + _pick>>
<<set _cap = "She was hungry for more. Day " + $gameDay + ".">>
<<galleryAdd _img _cap>>
Your phone goes again, and this time you're the only one who sees it. It's her, the girl from the Anchor you went home with and don't remember giving your number to.
<div class="chat">
<div class="bubble in">still got that itch 😉 you free?</div>
</div>
<div class="intro-image"><img @src="_img" width="100%"></div>
<span class="good">Saved to your gallery.</span>
<br><br>
''What do you do?''
<br>
/* EXTENSION POINT
Wire "Go see her" to a repeat-hookup scene mirroring Anchor ONS:
advance time, drop arousal, call <<addSuspicion 3>>, then route there.
For now it just returns. */
<<link "Go see her." "ONS Ex Hookup">>
<</link>>
<br>
<<link "Block the number for good." $return>>
<<set $ex.live = false>>
<<set $ex.saved = false>>
<</link>>
<br>
<<link "Leave it. Maybe another time." $return>>
/* stays live, will surface again */
<</link>><h2>The Phone on the Table</h2>
<<set $ex.pending = false>>
<<set $ex.day = $gameDay>>
<<set $ex.scares += 1>>
/* Her growing wariness. Raw bump, escalating each scare. Deliberately not
<<addSuspicion>>, since this is her noticing, not a fresh cheat. */
<<set $wife.suspicion += $ex.scares>>
<<moodShift -1 -1>>
<<set _excuse = [
"someone from work chasing a ticket",
"a wrong number, some kid texting the wrong guy",
"spam, one of those delivery scams going around"
].random()>>
You left your phone face up on the table. It lights up and buzzes its way halfway across the surface, and the preview sits there in plain sight for a second before you can move.
<div class="chat">
<div class="bubble in">hey it's the girl from the Anchor 😉 you ducked out before I could even get your name properly. was thinking about you. we should do that again sometime</div>
</div>
And there it is. The night comes back to you in pieces, the drinks, the walk, her hand on your arm, and somewhere in the haze of it you'd given her your number and forgotten you'd ever done it. Sober you would never. Drunk you handed it over like a damned business card.
<<= $wife.name>>'s eyes get to the screen before yours do. You can't tell how much of the preview she caught, but you can see her reading your face for the answer, and your face is doing you no favors.
<br><br>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_suspicious1.jpeg', 'images/characters/w/w_suspicious2.jpeg')" width="100%">
</div>
<<if $ex.scares == 1>>
You reach over a beat too fast and tell her it's <<= _excuse>>. She holds your eye a second longer than you'd like, then lets it go. The lie sits between you, and you both feel its weight even if only one of you knows its shape.
<<else>>
You give her <<= _excuse>>, the same easy lie as last time, and you can see her setting it down next to the last one. She doesn't argue. She just looks at you, and that's worse than if she did.
<</if>>
<br><br>
''What do you do?''
<br>
<<link "Block the number for good." $return>>
<<set $ex.live = false>>
<<set $ex.saved = false>>
<</link>>
<br>
<<link "Delete the text, but keep her number." $return>>
<<set $ex.saved = true>>
<</link>>/* INFO */
<<set $name = "Dave">>
<<set $energyMax = 5>>
<<set $energy = $energyMax>>
<<set $money = 100>>
/* Fitness and workout variables */
<<set $fitness = 0>>
<<set $fitnessTier = 0>>
<<set $fitnessTierUp = false>>
<<set $fitnessTierDown = false>>
<<set $lastWorkoutDay = 0>>
<<set $fitnessWarning = false>>
<<set $fitnessWarningShown = false>>
<<set $foughtToday = false>>
/* Arousal System */
<<set $arousal = 0>>
<<set $arousalMax = 10>>
<<set $ventedToday = false>>
/* Other variables */
<<set $drunk = 0>>
<<set $onsToday = false>>
/* ITEMS / OWNERSHIP */
<<set $items = {
pc: false,
yogaMats: false,
wine: 0
}>>/* Setup $return and tag "noreturn" functionality */
<<if not tags().includes("noreturn")>>
<<set $return to passage()>>
<</if>>
/* TRIGGERS*/
<<wifeSchedule>>
<<workCheck>><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header"><div class="ph-name">Messages</div></div>
<div class="phone-screen">
<div class="phone-list">
<a class="phone-row" data-passage="Phone Wife">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div class="pr-body">
<div class="pr-name">$wife.name</div>
<div class="pr-prev"><<if $phone.wifeUnread>>Sent you a photo<<else>>Tap to message<</if>></div>
</div>
<<if $phone.wifeUnread>><div class="pr-badge">●</div><</if>>
</a>
<a class="phone-row" data-passage="Phone Friend">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div class="pr-body">
<div class="pr-name">$friend.name</div>
<div class="pr-prev"><<if $phone.friendUnread>>Sent you a message<<else>>Tap to message<</if>></div>
</div>
<<if $phone.friendUnread>><div class="pr-badge">●</div><</if>>
</a>
<<if $phone.gallery.length > 0>>
<a class="phone-row" data-passage="Phone Gallery">
<div class="p-avatar" style="background:#2c2c36;">🖼</div>
<div class="pr-body">
<div class="pr-name">Gallery</div>
<div class="pr-prev"><<= $phone.gallery.length>> saved<<if $phone.galleryNew > 0>> · <<= $phone.galleryNew>> new<</if>></div>
</div>
<<if $phone.galleryNew > 0>><div class="pr-badge">●</div><</if>>
</a>
<</if>>
<a class="phone-row" data-passage="Phone Services">
<div class="p-avatar" style="background:#2c2c36;">🧹</div>
<div class="pr-body">
<div class="pr-name">Services</div>
<div class="pr-prev"><<if $maid.active>>Cleaning active<<else>>Tap to arrange<</if>></div>
</div>
</a>
</div>
</div>
<div class="phone-foot"><<link "Put the phone away" $return>><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div><div class="ph-name">$friend.name</div><div class="ph-sub">Old friend</div></div>
</div>
<div class="phone-screen">
<<if $phone.friendPingTopic !== "">>
/* He texted first. Mark read on open; message stays until you reply. */
<<set $phone.friendUnread = false>>
<div class="chat">
<<switch $phone.friendPingTopic>>
<<case "anchor">>
<div class="bubble in">On my usual stool at the Anchor tonight if you can get out. Same as ever, brother.</div>
<<case "checkin">>
<div class="bubble in">You alive over there? Your name hasn't lit up my phone in a while.</div>
<<case "memory">>
<div class="bubble in">Drove past our old college bar today. Still standing, somehow. Like us, barely. Thinking of you, man.</div>
<<case "ribbing">>
<div class="bubble in">Reminder that I'm still undefeated at darts and you still owe me a rematch you're going to lose.</div>
<<case "lowkey">>
<div class="bubble in">No reason. Just checking the line's still open on your end. It is on mine.</div>
<</switch>>
</div>
<<if not $phone.friendTextedToday>>
<div class="phone-actions">
<<link "Reply" "Phone Friend Ping">>
<<set $phone.friendTextedToday = true>>
<<set $friend.relationship += 1>>
<</link>>
</div>
<<else>>
<div class="phone-note">You've replied to $friend.name today.</div>
<</if>>
<<elseif not $phone.friendTextedToday>>
<div class="phone-actions">
<<link "Text $friend.name">>
<<set $phone.friendTextedToday = true>>
<<set $friend.relationship += 1>>
<<set $phone.msgTopic = ["bored","checkin","gym","drink","memory","ribbing","advice"].random()>>
<<goto "Phone Friend Reply">>
<</link>>
</div>
<<else>>
<div class="phone-note">You've traded messages with $friend.name today already.</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div><div class="ph-name">$friend.name</div><div class="ph-sub">Old friend</div></div>
</div>
<div class="phone-screen">
<div class="chat">
<<switch $phone.friendPingTopic>>
<<case "anchor">>
<div class="bubble in">On my usual stool at the Anchor tonight if you can get out. Same as ever, brother.</div>
<div class="bubble out">Might just take you up on that.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Good. I'll get the first round in and lie about whose it was. Get down here.</div>
<<else>>
<div class="bubble in">Do. It's been too long since you actually showed.</div>
<</if>>
<<case "checkin">>
<div class="bubble in">You alive over there? Your name hasn't lit up my phone in a while.</div>
<div class="bubble out">Still here. Heads down lately. Sorry, man.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">No apology needed. I just like knowing you're upright. That's the whole job of an old friend, checking you're still vertical.</div>
<<else>>
<div class="bubble in">Don't go dark on me again, that's all. Line's open.</div>
<</if>>
<<case "memory">>
<div class="bubble in">Drove past our old college bar today. Still standing, somehow. Like us, barely. Thinking of you, man.</div>
<div class="bubble out">God, that place. We practically lived in that booth.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Best years on the worst budget. I'd trade a chunk of what I've got now to be that broke and that happy again. Don't tell my accountant.</div>
<<else>>
<div class="bubble in">Long time ago now. Good times, though. We should make some new ones before we're too old to remember the old ones.</div>
<</if>>
<<case "ribbing">>
<div class="bubble in">Reminder that I'm still undefeated at darts and you still owe me a rematch you're going to lose.</div>
<div class="bubble out">Big talk from a man I've watched miss the board entirely.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">One time. One time, eleven years ago, and you'll take it to my grave. This is exactly why I keep you around.</div>
<<else>>
<div class="bubble in">Talk's cheap. Anchor, darts, you and me. Prove it.</div>
<</if>>
<<case "lowkey">>
<div class="bubble in">No reason. Just checking the line's still open on your end. It is on mine.</div>
<div class="bubble out">It's open. Means more than you'd think, you reaching out.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I know it does. That's why I do it. You spent long enough thinking you had to earn the phone call. You don't. Never did.</div>
<<else>>
<div class="bubble in">Good. Keep it that way. Not everything has to be a whole production, man.</div>
<</if>>
<</switch>>
</div>
<<if $phone.friendPingTopic == "anchor">>
<<if $friend.drankToday>>
<div class="phone-note">You've already had your session with him tonight.</div>
<<elseif $time < 5>>
<div class="phone-note">He'll be on his stool tonight. Too early to head down yet.</div>
<<elseif $time >= $timeMax>>
<div class="phone-note">Too late to head down and meet him now.</div>
<<elseif $money < 16>>
<div class="phone-note">A couple of rounds with him is more than you can cover tonight.</div>
<<else>>
<div class="phone-actions">
<<link "Head down to the Anchor and meet him. ($16)" "Anchor Friend">>
<<set $phone.friendPingTopic = "">>
<<friendDrinkSetup>>
<</link>>
</div>
<</if>>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">>
<<set $phone.friendPingTopic = "">>
<</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar friend"><<= $friend.name.charAt(0)>></div>
<div><div class="ph-name">$friend.name</div><div class="ph-sub">Old friend</div></div>
</div>
<div class="phone-screen">
<div class="phone-note"><<= ["You text $friend.name, aware it's been a while. You're never quite sure how much of the old ease is left.","You tap out a message to $friend.name, already half-expecting the dry line you've got coming."].random()>></div>
<div class="chat">
<<switch $phone.msgTopic>>
<<case "bored">>
<div class="bubble out">Dying of boredom over here. Entertain me.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">You're texting a man who golfs on Tuesdays for fun, brother. We are not the entertainment we used to be. Tragic, really.</div>
<<else>>
<div class="bubble in">Ha. Join the club. Get yourself down the Anchor one of these nights and we'll fix that.</div>
<</if>>
<<case "checkin">>
<div class="bubble out">You alive?</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Barely. Meetings all day with people who say "circle back" unironically. Good to see your name pop up, man. Means you're still upright.</div>
<<else>>
<div class="bubble in">Still here. Busy. You should come out, we never actually talk anymore.</div>
<</if>>
<<case "gym">>
<div class="bubble out">Trying to get back in shape. Don't laugh.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I would never. Proud of you, actually. The old you is in there under the takeout somewhere. Go dig him out.</div>
<<else>>
<div class="bubble in">About time. You used to be the fit one. Wild how that flips on a guy.</div>
<</if>>
<<case "drink">>
<div class="bubble out">We need a proper session soon.</div>
<<if ($weekday == 5 or $weekday == 6)>>
<div class="bubble in">Funny you should say it. I'm on my usual stool at the Anchor most of tonight. Get down here.</div>
<<else>>
<div class="bubble in">Weekend. Anchor. Same stool as ever. I'm not hard to find.</div>
<</if>>
<<case "memory">>
<div class="bubble out">Remember the road trip senior year? The car dying outside that diner?</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Two days on gas-station hot dogs waiting on a tow that never came. Best forty-eight hours of my life, and I've owned a boat since. Tells you something.</div>
<<else>>
<div class="bubble in">Vaguely. That was a long time and a lot of brain cells ago, man. Good days, though.</div>
<</if>>
<<case "ribbing">>
<div class="bubble out">Admit it, you only keep me around to feel tall.</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">I keep you around because you knew me before the money and still pick up. Also yes, the height thing. Mostly the first one.</div>
<<else>>
<div class="bubble in">Ha. Something like that. Get yourself out for a pint and I'll insult you properly, in person.</div>
<</if>>
<<case "advice">>
<div class="bubble out">Straight question. You ever feel like you missed the version of your life where it all worked out?</div>
<<if $friend.relationship >= 15>>
<div class="bubble in">Every damn day, brother. I hit the number and the feeling I was chasing wasn't in the account. You've still got the wanting. Don't waste it being miserable about the shape of it.</div>
<<else>>
<div class="bubble in">Heavy for a Tuesday. Yeah, sometimes. Everybody does. You're not as alone in it as you think.</div>
<</if>>
<</switch>>
</div>
</div>
<div class="phone-foot"><<link "Back" "Phone Friend">><</link>></div>
</div><<set $phone.galleryNew = 0>>
<div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header"><div class="ph-name">Gallery</div></div>
<div class="phone-screen">
<<if $phone.gallery.length == 0>>
<div class="phone-note">Nothing saved.</div>
<<else>>
<<for _i = $phone.gallery.length - 1; _i >= 0; _i-->>
<div class="phone-photo"><img @src="$phone.gallery[_i].img" width="100%"></div>
<div class="phone-cap"><<= $phone.gallery[_i].caption>></div>
<</for>>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><<set _rp = Story.has($return) ? Story.get($return) : null>>
<<set _together = _rp ? _rp.tags.includes($wife.location) : false>>
<div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div><div class="ph-name">$wife.name</div><div class="ph-sub">Wife</div></div>
</div>
<div class="phone-screen">
<<if $phone.wifeUnread>>
<<if $phone.wifeMsgType == "lingerie">>
<div class="chat">
<div class="bubble in"><<= [
"couldn't resist trying it on again 😘 thank you for this, you've got better taste than you let on 💕",
"feeling dangerously good in what you picked out for me 🔥 thought you should see what's waiting at home...",
"thanks for the shopping spree - you officially have an eye for this 😏 here's a little preview, don't get distracted 💋",
"so. worth. it. 😍 just gonna leave this right here and let you think about it all day 😈"
].random()>></div>
<div class="bubble in">📷 Photo</div>
</div>
<<else>>
<div class="chat"><div class="bubble in">📷 Photo</div></div>
<</if>>
<div class="phone-actions">
<<link "Open photo" "Phone Wife Pic">>
<<set _img = "images/characters/w/" + $phone.wifePendingImg>>
<<if $phone.wifeMsgType == "lingerie">>
<<set _cap = "She sent this in the lingerie you bought her. Day " + $gameDay + ".">>
<<else>>
<<set _cap = $wife.name + " sent this. Day " + $gameDay + ".">>
<</if>>
<<set $phone.viewImg = _img>>
<<galleryAdd _img _cap>>
<<set $phone.wifeUnread = false>>
<<set $phone.wifePendingImg = "">>
<<set $phone.wifeMsgType = "">>
<</link>>
</div>
<</if>>
<<if _together>>
<div class="phone-note">She's in the room with you. You could just talk to her.</div>
<<else>>
<div class="phone-actions">
<<if not $phone.wifeTextedToday>>
<<link "Send a message">>
<<set $phone.wifeTextedToday = true>>
<<set $phone.msgTopic = ["checkin","kid","miss","groceries","tonight","restaurant","weekend","apology"].random()>>
<<goto "Phone Wife Reply">>
<</link>>
<<else>>
<div class="phone-note">You've messaged her today already.</div>
<</if>>
<<if $gameDay >= $intimacyUnlockDay and not $phone.nudeAskedToday and ($gameDay - $phone.lastNudeDay) >= $phone.nudeCooldown>>
<<link "Ask her to send something">>
<<set $phone.nudeAskedToday = true>>
<<if $wife.relationship >= 50 and $wife.mood >= 1>>
<<set _nudes = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _nudes.push("w_phone_n" + _i + ".jpeg")>>
<</for>>
<<set _nudes = _nudes.filter(f => f !== $phone.lastNudeImg)>>
<<set _pick = _nudes.random()>>
<<set $phone.lastNudeImg = _pick>>
<<set $phone.lastNudeDay = $gameDay>>
<<set _img = "images/characters/w/" + _pick>>
<<set _cap = "She sent this when you asked. Day " + $gameDay + ".">>
<<set $phone.viewImg = _img>>
<<galleryAdd _img _cap>>
<<set $phone.msgTopic = "nude_yes">>
<<else>>
<<set $phone.msgTopic = "nude_no">>
<</if>>
<<goto "Phone Wife Reply">>
<</link>>
<</if>>
</div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div><div class="ph-name">$wife.name</div><div class="ph-sub">Wife</div></div>
</div>
<div class="phone-screen">
<div class="phone-photo"><img @src="$phone.viewImg" width="100%"></div>
<div class="phone-note">She really sent it.</div>
</div>
<div class="phone-foot"><<link "Back" "Phone Wife">><</link>></div>
</div><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header">
<div class="p-avatar wife"><<= $wife.name.charAt(0)>></div>
<div><div class="ph-name">$wife.name</div><div class="ph-sub">Wife</div></div>
</div>
<div class="phone-screen">
<<if $wife.mood >= 1>>
<<set _intro = ["You catch a free minute and text her, just because. The thought of it lifts something small.","You thumb out a message to her. It's the kind of small reach you don't make often enough."]>>
<<elseif $wife.mood == 0>>
<<set _intro = ["You sit with the phone a moment, then text her. Ordinary, the way most days are now.","You tap out a message to her between one thing and the next, no particular weight to it."]>>
<<else>>
<<set _intro = ["You hesitate over the phone longer than you should, then text her anyway, bracing a little for how it lands.","You start and delete it twice before you send. Things have been thin between you lately."]>>
<</if>>
<div class="phone-note"><<= _intro.random()>></div>
<div class="chat">
<<switch $phone.msgTopic>>
<<case "checkin">>
<div class="bubble out">How's your day going?</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Surviving. The lunch rush was a circus. Nice to get a text that isn't the daycare for once.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Busy. You know how it is.</div>
<</if>>
<<case "kid">>
<div class="bubble out">How's the boy been today?</div>
<<if $wife.mood >= 0>>
<div class="bubble in">A menace. Drew on the wall again. Your side of the family, clearly.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Fine. Handful, as usual. I've got it.</div>
<</if>>
<<case "miss">>
<div class="bubble out">Thinking about you.</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Yeah? That's not like you. I'll take it though.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">That's nice. I'm up to my elbows here, but... thanks.</div>
<</if>>
<<case "groceries">>
<div class="bubble out">Need me to grab anything on the way back?</div>
<<if $wife.mood >= 0>>
<div class="bubble in">Milk. And whatever you're having, because I'm too tired to think about dinner. You're a lifesaver, actually.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Milk, if you remember. You usually don't.</div>
<</if>>
<<case "tonight">>
<div class="bubble out">What are you thinking for tonight?</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Boy down by seven, then the sofa and something trashy. Don't fall asleep on me this time.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Same as every night. I'll believe the "we'll do something" when I see it.</div>
<</if>>
<<case "restaurant">>
<div class="bubble out">How's the shift? Tell me it's dead in there.</div>
<<if $wife.mood >= 1>>
<div class="bubble in">Slammed. A twelve-top that tipped in loose change and life advice. I'd rather be home losing the remote argument to you.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Busy. Feet are gone. Can't really be on my phone.</div>
<</if>>
<<case "weekend">>
<div class="bubble out">Should we try to do something this weekend? The three of us.</div>
<<if $wife.mood >= 0>>
<div class="bubble in">Look at you, planning. The park if it's dry, and you're on bag duty this time. Deal.</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">If you actually mean it, sure. I've heard "this weekend" before, though.</div>
<</if>>
<<case "apology">>
<div class="bubble out">I know I've been hard to live with lately. I'm sorry. I'm working on it.</div>
<<if $wife.mood >= 0>>
<div class="bubble in">...That's not nothing. Thank you for saying it. Just let me see it too, alright?</div>
<<moodShift 1>>
<<else>>
<div class="bubble in">Okay. We'll see. Words have been cheap around here lately.</div>
<</if>>
<<case "nude_yes">>
<div class="bubble out">Send me something to get me through the day.</div>
<div class="bubble in">You're terrible. Lock your phone, for God's sake.</div>
<<case "nude_no">>
<div class="bubble out">Send me something. You know what I mean.</div>
<<if $wife.relationship >= 30>>
<div class="bubble in">Ha. Not today, tiger. Earn it first.</div>
<<else>>
<div class="bubble in">Are you serious? No.</div>
<<moodShift -1>>
<</if>>
<</switch>>
</div>
<<if $phone.msgTopic == "nude_yes">>
<div class="phone-photo"><img @src="$phone.viewImg" width="100%"></div>
<div class="phone-note"><span class="good">Saved to your gallery.</span></div>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone Wife">><</link>></div>
</div><h2>Your Supporter Page</h2>
You pull up your project's page and check the numbers.
<br><br>
<<if $project.supporters > 0>>
<<print $project.supporters>> supporters, holding steady at $<<print $project.weeklyIncome>> a week. Not enough to quit anything over. Enough to feel like something you made is wanted.
<br><br>
''Recent activity''
<br>
<<set _names = ["xX_NightOwl_Xx", "GrumpyDad42", "anon_4417", "VelvetThunder", "tired_teacher", "lurkmaster99", "Sir_Reginald_III", "pixelpirate", "QuietStorm", "j_morrison", "GoonieX", "LumpY420", "basedBaby8", "Drunkencycle", "PrinceyDincey", "Shiggy", "KaxelAy", "SnyeSkark", "February_Fade", "Jameey", "bigkai542"]>>
<<set _comments = [
"keep it up, rare to see a dev who actually ships",
"the new build fixed my save bug. a hero, truly",
"take my money and just add more content",
"been here since v0.1, proud of you man",
"when's the next update dropping?? need it",
"worth every cent, don't burn out on us",
"finally a dev who reads the feedback",
"showed the game to my mom, but she didn't understand",
"soo psyched for next release!",
"are there any plans to add tentacles?!?!?!!?!",
"Is this game still getting updates? 👀 I find myself addicted to the game play, this has a lot of potential!",
"is there a way to auto max my stats",
"I know it is still in the early stages but seeing your game has an update got me excited. It is coming along really well. Poker night is interesting.",
"I like the improvements. Your game is coming along really well. <3",
"A lot of potential! No bugs so far, and I look forward to coming back and checking it out with each new update! Don't forget to take your time tho, and drink some water and rest! :)",
"more exhibitionism please!",
"How about actually researching Erotica instead of just feeding prompts in the AI, you pleb? Start with Aristotle's Poetics and return once you've learned this refined craft. There are no shortcuts to smut worth reading."
]>>
<<for _i = 0; _i < 3; _i++>>
//<<= _names.random()>>//: <<= _comments.random()>>
<br>
<</for>>
<br>
You could open the full dashboard over on <<link "FanForge">><<script>>window.open('https://www.patreon.com/Albasaur')<</script>><</link>>, but there's not much more to see tonight.
<<else>>
The page is live, but it's quiet. No supporters yet, no comments, just the version number and a description you've rewritten four times. It's out there. That's the most you can say for it so far.
<</if>>
<br><br>
<<link "Close the page." "Computer">><</link>><h1>Relations</h1>
/* ASHLEY — always unlocked while the game is running */
<div class="rel-entry">
<div class="rel-portrait ashley"></div>
<div class="rel-name">$wife.name</div>
<div class="rel-role">Your wife</div>
<div class="rel-body">
<<if $wife.mood >= 3>>
<p>Today she's bright and affectionate, leaning toward you whenever you cross paths.</p>
<<elseif $wife.mood == 2>>
<p>She's in a warm mood today, easy with you in a way she usually isn't.</p>
<<elseif $wife.mood == 1>>
<p>She seems content today, settled and unbothered.</p>
<<elseif $wife.mood == 0>>
<p>She's neither warm nor cold today, just going about her day.</p>
<<elseif $wife.mood == -1>>
<p>She's irritable today, her answers short and her patience thin.</p>
<<elseif $wife.mood == -2>>
<p>She's visibly upset, keeping her distance.</p>
<<else>>
<p>She's furious, her jaw set whenever she sees you.</p>
<</if>>
<<if $wife.relationship >= 80>>
<p>Underneath the day-to-day, the two of you are close to what you were at the start. She trusts you, and she wants you to win.</p>
<<elseif $wife.relationship >= 50>>
<p>Underneath the day-to-day, a real partnership is rebuilding. The resentment isn't gone, but it isn't the loudest thing in the room anymore.</p>
<<elseif $wife.relationship >= 25>>
<p>Underneath the day-to-day, there's a slow thaw between you. She gives you the benefit of the doubt more often than not now.</p>
<<elseif $wife.relationship >= 0>>
<p>Underneath the day-to-day, the two of you hold a quiet truce, living alongside each other without much warmth but without open conflict.</p>
<<elseif $wife.relationship >= -10>>
<p>Underneath the day-to-day, things are strained. She doesn't trust you and doesn't bother hiding it.</p>
<<else>>
<p>Underneath the day-to-day, it's effectively over. She's here because she has nowhere else to go.</p>
<</if>>
<<if $wife.suspicionLocked>>
<p>And she knows. The worst of what you did behind her back is out now, no longer a secret to keep but a thing to live down. Stay clean and it stays in the past.</p>
<<elseif $wife.suspicion >= 10>>
<p>And you've stepped out on her enough times now that you've half stopped believing you'll get away with it. It's no longer a question of whether it surfaces, more a question of when.</p>
<<elseif $wife.suspicion >= 5>>
<p>And you've been unfaithful more than once, and left more than one loose thread behind you. Secrets like these have a way of working their way to the surface.</p>
<<elseif $wife.suspicion >= 1>>
<p>And there's the matter of what you did behind her back. Small enough to tell yourself it meant nothing, but not the kind of thing that stays buried on its own.</p>
<</if>>
</div>
</div>
/* FUTURE: assistant, au pair, etc. Each becomes its own <div class="rel-entry">,
gated behind its unlock flag, e.g.:
<<if $assistant.met>> ... <</if>>
Add a matching .rel-portrait.<name> rule in the stylesheet for the avatar. */
<div class="rel-foot"><<link 'Return' $return>><</link>></div><h2>Night</h2>
<<dayshift>>
/* Build event pool */
<<set _events = ["restful", "quick", "uneventful", "street_shout", "car_alarm", "radiator", "cold_room"]>>
/* Wife mood / relationship */
<<if $wife.mood <= -1 or $wife.relationship < 0>>
<<run _events.push("cold_bed", "wife_awake")>>
<</if>>
<<if $wife.mood >= 1 and $wife.relationship >= 25>>
<<run _events.push("wife_close", "watching_her")>>
<</if>>
/* Arousal: the higher the arousal, the worse the odds of a decent night */
<<if $arousal >= 7>>
<<run _events.push("hot_dream", "restless", "wound_up")>>
<<if $arousal >= 9>>
<<run _events.push("hot_dream", "restless", "wound_up")>>
<</if>>
<</if>>
/* Went to bed exhausted */
<<if $energy <= 1>>
<<run _events.push("dead_to_world")>>
<</if>>
/* Random nuisance events */
<<if random(1, 8) == 1>>
<<run _events.push("snoring")>>
<</if>>
<<if random(1, 6) == 1>>
<<run _events.push("kid_crying")>>
<</if>>
<<if random(1, 7) == 1>>
<<run _events.push("neighbors")>>
<</if>>
/* Pick one */
<<set _chosen = _events.random()>>
<<switch _chosen>>
<<case "restful">>
You sleep deeply, and the night passes in what feels like minutes. You wake to soft morning light, the weight of the day not yet on you.
<<case "quick">>
You drift off quickly and wake when the first gray light pushes through the curtains. Nothing in between.
<<case "uneventful">>
Sleep comes easily and leaves the same way. The night passes without anything worth remembering.
<<case "street_shout">>
Sometime past midnight you wake to someone shouting in the street below. By the time you've worked out it's nothing to do with you, they've moved on. The street goes quiet again, and after a while so do you.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "car_alarm">>
A car alarm goes off somewhere on the block. It cuts out, starts again, cuts out, and finally stays quiet. You aren't sure when you fell back asleep.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "radiator">>
The radiator clanks at some godforsaken hour. You lie there listening to it until it settles, and you don't quite get the night back after that.
<<case "cold_room">>
You wake some time before dawn, cold, the blanket bunched somewhere on the floor. You drag it back over yourself and try to find the warm spot again. It takes a while.
<<case "cold_bed">>
$wife.name sleeps with her back to you, the duvet bunched between you like a wall. You match her posture and pretend it doesn't matter.
<<case "wife_awake">>
You wake briefly in the small hours. $wife.name is awake too, eyes open in the dark, not looking at you. Neither of you says anything. Eventually you both pretend to be asleep again.
<<case "wife_close">>
Sometime in the night $wife.name shifts against you in her sleep, her cheek finding your shoulder. You stay very still so as not to wake her.
<<case "watching_her">>
You wake before her and lie there for a while, listening to her breathing. It feels like an unearned gift.
<<case "hot_dream">>
You dream of something hot and half-remembered. You wake with your heart still going, a hard on and the dream already slipping. By the time you sit up, only the heat is left. Your mind is racing with lust, and you have a hard time getting back to sleep.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "restless">>
Sleep doesn't come easy with a hard on. You lie there for what feels like hours, mind wandering somewhere it shouldn't, until exhaustion finally pulls you under.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "wound_up">>
You lie there wide awake, wound too tight to settle. Your thoughts keep circling back to the hottie from the office. It's too late to jerk off now, so you settle in and try to keep your head clean. Sleep, when it finally comes, is thin and grudging. You surface before the alarm, already tired.
<<set $energy = Math.max($energyMax - 1, 1)>>
<br><br>
<span class="bad">You slept badly. You're starting the day short on energy.</span>
<<case "dead_to_world">>
You hit the pillow and that's the last thing you remember. You wake feeling like you barely moved all night.
<<case "snoring">>
$wife.name elbows you awake at some point in the night, mumbling that you're snoring. You grunt an apology and roll over. By morning she still seems kinda pissed about it.
<<moodShift -1>>
<<case "kid_crying">>
At some point in the small hours, your kid starts crying from down the hall. $wife.name is up before you've even processed it. You hear her low voice through the wall, soothing, patient. By the time she comes back to bed, you're already pretending to be asleep.
<<if $wife.mood <= 0>>
<<moodShift -1>>
<</if>>
<<case "neighbors">>
You're nearly under when it starts up through the ceiling. The couple upstairs, the headboard finding its rhythm, and then her voice, low at first and climbing. You lie still in the dark and listen to a stranger's wife work her way toward climaxing, the sound carrying clean through the thin plaster as though the wall were never there. $wife.name doesn't stir beside you. By the time it finishes overhead you're wide awake, and wishing it was you making a woman sound like that.
<br><br>
<span class="arousal">Arousal increased.</span>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<</switch>>
<br><br>
<<link "Get up." $morningScene>><</link>><h2>Taking the Edge Off</h2>
<<set _gifs = []>>
<<for _i = 1; _i <= 15; _i++>>
<<set _gifs.push("p" + _i + ".gif")>>
<</for>>
<div class="intro-image">
<img @src="'images/h/self/' + _gifs.random()" width="100%">
</div>
<br>
You need some quick relief, so you take out your phone, and find a good video. Before long, you've defiled a tissue.
<<set $arousal = Math.max($arousal - 3, 0)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $ventedToday = true>>
/* Costs a time phase during the day, so venting competes with everything else
you could be doing. Free at Night so it's never too late to take the edge off
before bed, though it carries the risk of $wife seeing you */
<<if $time < $timeMax>>
<<set $time = Math.min($time + 1, $timeMax)>>
<</if>>
/* Catch roll: only if she's home but elsewhere in the house. If she's "out",
no risk at all. */
<<set _caught = false>>
<<if ["bedroom","kitchen","livingroom","bathroom"].includes($wife.location)>>
<<if random(1, 100) <= 50>>
<<set _caught = true>>
<</if>>
<</if>>
<<if _caught>>
<br><br>
Just as you ejaculate, you hear the door and suddenly $wife.name is there and catches you in the act.
<<if $wife.relationship < 0>>
<<speech "Wife" $wife.name>>
What the hell are you doing? I live here too, you know.
<</speech>>
<<moodShift -2 -2>>
<<else>>
<<speech "Wife" $wife.name>>
Seriously? Could you not? God.
<</speech>>
<<moodShift -1 -1>>
<</if>>
<</if>>
<br><br>
<<link "Continue." $return>><</link>><img src = "images/logo/earnit_logo_lastcall_transparent_tight.png" width = "100%"><<if $gameRunning>>
<div class="datetime"><<datetime>></div>
<<if $weekday <= 5 and $time == 1 and !$job.attendedToday>>
<span class="warning">You should be at work.</span><br>
<<elseif $weekday <= 5 and $job.missedToday>>
<span class="bad">You skipped work today.</span><br>
<</if>>
<<if $weekday == 6>>
<span class="warning">Rent is due tomorrow: $<<print $rent>>.</span><br>
<</if>>
<<paydayFeedback>>
<<rentFeedback>>
<<maidFeedback>>
<<projectPayoutFeedback>>
<<fitnessFeedback>>
<<meter $energy $energyMax "Energy">>
<<meter $arousal $arousalMax "Arousal" "#B23A6B">>
<<print 'Money: $' + $money>><br>
<<if $debugMode == true>>
<br><br>
<<link [[Control Panel|Control Panel]]>>
<</link>>
<br>
$wife.name Relationship: $wife.relationship
<br>
$wife.name Worry: $wife.worry
<br><br>
<</if>>
<div class="sidebar-nav">
<span @class="($phone.wifeUnread or $phone.friendUnread or $phone.galleryNew > 0) ? 'nav-item nav-alert' : 'nav-item'"><<link "📱 Phone" "Phone">><</link>></span>
<<link $name "Character">><</link>>
<<link "Relations" "Relations">><</link>>
</div>
<<else>>
<</if>><<set $gameTitle = "Earn It">>
<<set $gameRunning = false>>
<<set $debugMode = false>>
<<include 'PC Setup'>>
/* Time Variables */
<<set $time = 0>>
<<set $timeMax = 8>>
<<set $weekday = 1>> /* 1 = Monday */
<<set $gameDay = 1>>
<<set $intimacyUnlockDay = 8>> /* no intimacy with wife before week 2 */
/* Chores */
<<set $chores = {
bedroom: false,
kitchen: false,
livingroom: false,
}>>
/* Wife Variables */
<<set $wife = {
name: "Ashley",
relationship: 0,
mood: 0,
location: "kitchen",
bailedOut: false,
choreToday: false,
choreCounter: 0,
choreThanks: false,
choreNeglect: 0,
choreScold: false,
careToday: false,
careCounter: 0,
careThanks: false,
careNeglect: 0,
careScold: false,
talkedToday: false,
cookedToday: false,
talkTopic: "",
intimacyToday: false,
lastInteraction: "",
spiedToday: false,
bathroomViewedToday: false,
arousalNoticedToday: false,
suspicion: 0,
suspicionLocked: false,
cheatedToday: false,
discoveryToday: false,
discoveryResult: 0,
ultimatumShown: false,
ultimatumToday: false,
worry: 0,
recklessToday: false,
worryScoldToday: false,
worryResult: 0,
tipsy: false,
wineToday: false,
lastWineDay: -3,
dateToday: false,
lastDateDay: -3,
dateType: "",
dateQuality: "",
doingYoga: false,
yogaViewedToday: false,
wardrobeMalfunction: false,
wardrobeRollDay: 0,
wardrobeSeen: false,
tidyRollDay: 0,
tidyToday: false,
lastIntimacyDay: -99,
cycleStart: random(0, 27),
cycleOff: false,
outingResolved: false,
outForDay: false,
lazyMorningToday: false,
affectionToday: false,
lingerieSelfieDay: 0
}>>
/* Friend Variables) */
<<set $friend = {
name: "Col",
relationship: 0,
drankToday: false,
topic: "",
lastTopic: ""
}>>
/* Work System */
<<set $job = {
title: "Junior Software Engineer",
wage: 100,
level: 1,
daysWorked: 0,
daysMissed: 0,
performance: 0,
attendedToday: false,
missedToday: false,
wfhToday : false,
breakRoomRollDay: 0,
breakRoomToday: false,
promotionPending: false,
paidThisWeek: null,
lastAttendance: 0,
eventToday: false,
distractedToday: false,
lastWorkScene: "",
eventOutcome: "",
sceneGif: "",
sceneText: "",
drainType: "",
lastDrainDay: -99,
drainCooldown: 5,
stayedLate: false,
lastCalloutDay: -99,
calloutCooldown: 10,
calloutPending: false
}>>
/* Rent System */
<<set $rent = 400>>
<<set $rentResult = null>>
/* Other variables */
<<set $gameOverCause = null>>
<<set $onsEver = false>>
<<set $swEver = false>>
<<set $sceneLoc = "">> /* Intimacy scene location snapshot */
<<set $morningScene = "Bedroom">>
/* Computer variables */
<<set $pcMsg = "">>
<<set $project = {
started: false,
dev: 0, /* progress toward the next release */
devNeeded: 3, /* sessions needed for the next release; grows each version */
version: 0, /* releases shipped */
supporters: 0, /* drives weekly income */
weeklyIncome: 0, /* paid out each Monday */
lastPayout: 0
}>>
/* One Night Stand Ex Variables */
<<set $ex = {
live: false,
saved: false,
pending: false,
day: 0,
scares: 0,
lastNudeImg: ""
}>>
/* Phone Variables */
<<set $phone = {
unlocked: true, /* set false for a later tutorial unlock */
gallery: [], /* array of {img, caption, day} */
galleryNew: 0,
wifeUnread: false,
wifePendingImg: "",
wifeTextedToday: false,
nudeAskedToday: false,
lastNudeDay: -3,
nudeCooldown: 7,
lastNudeImg: "",
intimacyPicToday: false,
friendTextedToday: false,
friendUnread: false,
lastFriendPing: 0,
friendCooldown: 4,
friendPingTopic: "",
msgTopic: "",
viewImg: "",
wifeMsgType: ""
}>>
/* Cleaning service (maid) */
<<set $maid = {
active: false,
cost: 75,
lastBilled: 0,
billedThisWeek: 0,
lapsed: false
}>>[[Version 0.1.4|Version]]
<br>
<<link "Patreon">><<script>>window.open('https://www.patreon.com/Albasaur')<</script>><</link>><h2>Living Room</h2>
<<set $arousal = Math.min($arousal + 2, $arousalMax)>>
<<set _theme = ["oldies", "news", "sport"].random()>>
<<switch _theme>>
<<case "oldies">>
<<set _tvGif = "images/h/tv/vintage" + random(1, 8) + ".gif">>
<<set _lines = [
"You flick past the oldies channel and stop. One of those films from decades back, the picture soft and grainy, and a scene playing out that no one involved seems to have thought twice about. Back then the artistic freedom meant big old titties on display as much as possible. Absolute cinema.",
"The oldies channel is running one of the classics, the kind they made before everyone got nervous about showing a good old pair of jugs. A scene unfolds with an easy, unbothered frankness you don't see much anymore, the actors carrying on like it's the most natural thing in the world. You linger on it a while before moving on.",
"You land on the oldies channel mid-scene. Grain, warm color, a certain looseness to how these old films handled things, as if nobody had told them to be coy about it. Less about story and more about getting people going. It catches you off guard, and you sit with it longer than you'd admit before thumbing to the next channel.",
"An old film is playing on the retro channel, from back when this sort of thing turned up in a Tuesday-night picture without ceremony. Not to give some great cinematic experience. More for the purpose of watching some knockers or melons or whatever they called it back then. You watch it play out before you carry on flicking."
]>>
<<case "news">>
<<set _tvGif = "images/h/tv/show" + random(1, 5) + ".gif">>
<<set _lines = [
"The news is on, or something dressed up as news, an anchor at a curved desk reading autocue in a top a size too deliberate. Every cutaway to the weather graphic is really a cutaway to the woman standing in front of it. You watch a full forecast for a region you'll never visit.",
"Some panel show, minor celebrities you half recognize, and a presenter who spends the whole segment crossing and recrossing her legs in a way the director keeps finding excuses to frame. You couldn't tell anyone what they were discussing. You weren't listening.",
"A daytime magazine programme, the couch kind, and the co-host has one of those laughs that makes the guest lean in and the audience whoop. She's dressed for a warmer studio than the one she's in, and the show knows it, and so, after a minute, do you."
]>>
<<case "sport">>
<<set _tvGif = "images/h/tv/sport" + random(1, 5) + ".gif">>
<<set _lines = [
"You land on the sports channel, and it isn't the game that holds you. The camera is very keen on who it follows, and whoever's directing has strong opinions about where the lens belongs. Keeps viewers hooked, you guess. You stay on it far longer than a man with no team in the match has any business doing.",
"Some match you have no stake in, and you couldn't say who's ahead. What keeps you on the channel is everything happening at the edges of the play, the camera drifting off the action every chance it gets. You follow it with a focus you can't manage for anything that actually matters.",
"You tell yourself you're only waiting for something better to come on. But the camera keeps lingering where it shouldn't, and you don't change the channel, and the game plays on without you following a second of it."
]>>
<</switch>>
<div class="intro-image">
<img @src="_tvGif" width="100%">
</div>
<<= _lines.random()>>
<span class="arousal">Arousal increased.</span>
<br><br>
<<link "Keep flicking." $return>><</link>><h2>The Anchor</h2>
A windowless box of a bar at the dead end of the plaza, lit the color of weak tea. A jukebox nobody's updated since the nineties, a couple of beers on tap, and a handful of regulars who treat the place like a second living room. The bartender, a heavyset woman called Marie, polishes a glass that was clean an hour ago.
<<switch $time>>
<<case 2>>Midday, and the Anchor is all but empty, a regular or two nursing the first of the day beneath the muted TV.
<<case 3>>The afternoon is slow and quiet, dust turning in the light from the propped-open door while Marie restocks the cooler.
<<case 4>>Late afternoon, and the first drinkers of the day drift in, shrugging off work or the lack of it.
<<case 5>>Early evening, and the after-work drinkers are trickling in, loosening ties they'll regret in the morning.
<<case 6>>The evening crowd has settled, the talk low and steady under the jukebox.
<<case 7>>Late, and the place has thinned to the committed, the ones with nowhere they'd rather be.
<<default>>Past closing for most places, but the Anchor keeps its own hours. A few stragglers nurse the last of the night.
<</switch>>
<br><br>
/* Drink */
<<if $time >= $timeMax>>
//It's late enough. One more and you won't make it home.//
<<elseif $money >= 8>>
A pint runs $8.
<br>
<<link "Buy a drink and settle in. ($8)" $return>>
<<set $money -= 8>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $drunk += 1>>
<</link>>
<<else>>
//A pint's $8, and you're short even for that.//
<</if>>
<<if $drunk == 1>>
<br>
//One in, and the day's edges have started to soften.//
<<elseif $drunk == 2>>
<br>
//Two deep. Warm, loose, the bar a friendlier place than it was.//
<<elseif $drunk >= 3>>
<br>
//You've had a few. The room has the gentle tilt of a night getting away from you.//
<</if>>
/* Friend, on Friday and Saturday evenings */
<<if ($weekday == 5 or $weekday == 6) and $time >= 5>>
<br><br>
<<if $friend.drankToday>>
//$friend.name is still propping up the far end of the bar, but you've had your session with him tonight.//
<<elseif $time >= $timeMax>>
$friend.name is here, but he's pulling his coat on. Too late to settle in with him now.
<<elseif $money < 16>>
$friend.name waves you over from his usual stool, but a proper session with him is a couple of rounds you can't cover tonight.
<<else>>
$friend.name is at the far end of the bar, same stool as ever, and lifts his glass when he spots you.
<br>
<<link "Have a few with $friend.name. ($16)" "Anchor Friend">>
<<friendDrinkSetup>>
<</link>>
<</if>>
<</if>>
/* Pickup: a stranger to take home. Needs a few drinks for the nerve, and
the night's one shot at it. */
<<if $time < $timeMax and $drunk >= 2 and not $onsToday>>
<br><br>
The bar is the kind of busy where a stranger could become the rest of your night, if you had the nerve to start it.
<br>
<<link "Try your luck with someone." "Anchor Pickup">><</link>>
<</if>>
<br><br>
<<link [[Step back out to the plaza.|Eastgate Plaza]]>><</link>><h3>Version 0.1.4</h3>
- Nights aren't always restful now. A bad night's sleep can leave you starting the next day with less energy than usual.
<br>
- Reworked how the game decides which scene greets you in the morning, so confrontations with $wife.name resolve cleanly and never step on each other.
<br>
- A tense morning conversation with $wife.name now takes place in the bedroom, where it belongs.
<br>
- Some workdays hit harder than others now. Occasionally a shift will grind you down for an extra point of energy, and now and then you'll be asked to stay late, trading time and energy for standing at Helion, or ducking out and taking the hit to your performance.
<br>
- Keeping the flat in order and keeping $wife.name close are now two separate things. Let the house go and she'll say something about the mess; let her go and she'll say something about you. The cleaning service handles the first. Nothing handles the second but you.
<br>
- Helion may occasionally call you in on a Saturday. Answer it for money and career, or turn it down for the family outing. Either way something gives.
<br>
- New artwork for one of $wife.name's harder mornings.
<br>
- Revisions of the erotica texts. This will be an ongoing thing until I have been through all earlier scenes.
<br>
- Various fixes under the hood.
<br><br>
<h3>Version 0.1.3 - Intimacy with $wife.name</h3>
This one's for everyone on f95zone who asked for more with $wife.name. You were loud about it, and you were right.
<br><br>
- You can now hold $wife.name close in the interact menu, a quiet moment of affection that lifts her mood and slowly builds your relationship. Catch her in the right frame of mind, though. If she's irritable, she'll wave you off.
<br>
- $wife.name is more her own person in bed now. Her mood colors how present she is and how much pleasure she is getting, so a good day can warm her up even early on, and there's more variety in how each moment plays out instead of the same lines every time.
<br>
- A new date: take $wife.name lingerie shopping once things are warming up between you. Help her pick a set, and a few days later she might send a little something to remind you it was worth the trip.
<br>
- Content added to existing sex scenes in office and for the one night stand.
<br>
- Reworked the sidebar: Phone, Character, and Relations are now gold buttons grouped together, separated from the version and Patreon links.
<br>
- Bug fixes and general rebalancing, including a special focus on rebalancing energy, making for a bit more of a challenge and more incentive to work out.
<br><br>
<h3>Version 0.1.2 </h3>
- Reworked the Relations menu into a cleaner, more readable format, with room for new faces to join the cast as the story grows.
<br>
- $wife.name will now go all the way with you in the kitchen, not just the bedroom, bathroom, and living room. Catch her there in the right mood.
<br>
- A cleaning service is now available under Services in your phone. Pay weekly and your home keeps itself tidy, so the chores stop being your job and $wife.name stops resenting the mess.
<br>
- New and improved images of $wife.name relaxing in the living room.
<br>
- Bug fixes and balancing, including a cap on how far chores alone can carry your relationship with $wife.name (around 50%).
<br><br>
<h3>Version 0.1.1 - Phone</h3>
- Added a phone in the sidebar. Text $wife.name, and as things warm up with her, ask her for pictures that save to a gallery you can come back to, or perhaps she will let you snap a photo of her in action.
<br>
- Also the option to text $friend.name. He may also reach out and invite you to the bar.
<br>
- A one-night stand can now come back to haunt you. Hungry for more, she may resurface by text, and keeping that hidden from $wife.name is its own quiet risk.
<br>
- Bug fixes and balancing.
<br><br>
<h3>Version 0.1.0 - First release</h3>
Welcome to //Earn It//.
You're $name: thirty pounds heavier than you used to be, a failed company behind you, and a marriage held together mostly by a wife with nowhere better to go. There's a son who barely knows you, rent you can't always cover, and a job writing code for people whose names you're not allowed to know. Nobody's handing you the way back. Whatever you want from here, her trust, the money, your own reflection in the mirror, you earn it.
<br><br>
This first release covers the core of the game: the daily grind of work, chores, and training, a marriage you can rebuild or wreck, the climb up the ladder at Helion Dynamics, and a handful of ways to spend, or waste, your evenings around town. It's the foundation, and it's playable start to finish, but it's a foundation. Plenty of doors in this version are locked for now. They'll open as the game grows.
<br><br>
Thank you for playing this early. Bug reports and feedback will shape what comes next.
<br><br>
//Albasaur//
<br><br>
<<link "Close version description." $return>><</link>><h2>Out with the Family</h2>
<<set $wife.outingResolved = true>>
<div class="intro-image wide">
<img src="images/dates/outing_parkbench.jpeg" width="100%">
</div>
<br>
<<set $time = 5>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set _score = random(1, 100) + ($wife.mood * 10) + Math.floor($wife.relationship / 5)>>
<<if _score >= 80>>
<<set _q = "great">>
<<elseif _score >= 40>>
<<set _q = "good">>
<<else>>
<<set _q = "flat">>
<</if>>
<<switch _q>>
<<case "flat">>
<<set $wife.relationship += 1>>
The afternoon is fine. You push the swing, you carry the bag, you say the right things at the right times, and some part of you stays a half-step outside it all, watching yourself do it. $wife.name notices, the way she notices everything now. But you were there, and the boy laughed at least once, and that isn't nothing.
<<case "good">>
<<set $wife.relationship += 2>>
<<moodShift 1>>
It's an easy few hours. The park, an ice cream that ends up mostly on the boy, the slow walk back with him asleep against $wife.name's shoulder. The talk between you comes without effort for once, about nothing in particular, which is its own small luxury.
<<case "great">>
<<set $wife.relationship += 3>>
<<moodShift 1>>
Somewhere between the swings and the walk home it stops feeling like effort. The boy has you chasing him until you are both breathless, and when you look up $wife.name is watching the pair of you with something on her face you haven't earned in a long time. She takes your hand on the way back. Nobody says anything. Nobody needs to.
<</switch>>
<br><br>
<<link "Head home." "Living Room">><</link>><<set _outingImg = either('images/characters/w/w_casualOutingAsk1.jpeg', 'images/characters/w/w_casualOutingAsk2.jpeg')>>
<div class="intro-image wide">
<img @src="_outingImg" width="100%">
</div>
<br>
<<if $wife.mood >= 1>>
$wife.name has the boy's bag over one shoulder, gathering up the last of his things by the door.
<<speech "Wife" $wife.name>>
We're heading out for a bit. Come with us?
<</speech>>
<<else>>
$wife.name is getting the boy's things together, coat and bag by the door.
<<speech "Wife" $wife.name>>
I'm taking him out. You can come, if you want.
<</speech>>
<</if>>
<br>
<<link "Go with them for the afternoon." "Weekend Outing">>
<</link>>
<br>
<<link "Stay. You've got things to do." $return>>
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<</link>>/* START OF: DAYSHIFT */
<<widget "dayshift">>
/* Advance total game day */
<<set $gameDay += 1>>
/* Reset time of day */
<<set $time = 0>>
/* Advance weekday */
<<set $weekday += 1>>
<<if $weekday > 7>><<set $weekday = 1>><</if>>
/* Side project: weekly supporter income, paid Monday */
<<if $weekday == 1 and $project.weeklyIncome > 0>>
<<set $money += $project.weeklyIncome>>
<<set $project.lastPayout = $project.weeklyIncome>>
<<else>>
<<set $project.lastPayout = 0>>
<</if>>
/* Fitness: Days since training */
<<set _daysInactive = $gameDay - $lastWorkoutDay>>
/* Fitness: Warning (5+ days, only once) */
<<if _daysInactive >= 5 and not $fitnessWarningShown>>
<<set $fitnessWarning = true>>
<<set $fitnessWarningShown = true>>
<<else>>
<<set $fitnessWarning = false>>
<</if>>
/* Fitness: Decay (7+ days) */
<<if _daysInactive >= 7>>
<<set $fitness -= 1>>
<<if $fitness < 0>><<set $fitness = 0>><</if>>
<</if>>
/* Fitness: Recalculate tier */
<<fitnesscheck>>
/* Reset wife mood toward relationship baseline (before event overrides) */
<<if $wife.relationship > 100>><<set $wife.relationship = 100>><</if>>
<<moodReset>>
/* Upkeep neglect. Two days of nothing and she says something. */
<<if not $wife.choreToday>>
<<set $wife.choreNeglect += 1>>
<<else>>
<<set $wife.choreNeglect = 0>>
<</if>>
<<if $wife.choreNeglect >= 2>>
<<set $wife.relationship -= 1>>
<<set $wife.choreNeglect = 0>>
<<set $wife.choreScold = true>>
<<set $wife.choreThanks = false>>
<<if $wife.mood > -2>><<set $wife.mood = -2>><</if>>
<</if>>
/* Care neglect. Slower fuse, deeper cut. */
<<if not $wife.careToday>>
<<set $wife.careNeglect += 1>>
<<else>>
<<set $wife.careNeglect = 0>>
<</if>>
<<if $wife.careNeglect >= 4>>
<<set $wife.relationship -= 2>>
<<set $wife.careNeglect = 0>>
<<set $wife.careScold = true>>
<<set $wife.careThanks = false>>
<<if $wife.mood > -2>><<set $wife.mood = -2>><</if>>
<</if>>
/* Chores reset */
<<set $chores = {
bedroom: false,
kitchen: false,
livingroom: false,
}>>
/* Cleaning service: weekly billing, then daily auto-clean.
Runs after the chore reset so the maid re-cleans for today; next
dayshift's neglect check then sees yesterday's chores done. */
<<if $maid.active and ($gameDay - $maid.lastBilled) >= 7>>
<<if $money >= $maid.cost>>
<<set $money -= $maid.cost>>
<<set $maid.lastBilled = $gameDay>>
<<set $maid.billedThisWeek = $maid.cost>>
<<else>>
<<set $maid.active = false>>
<<set $maid.lapsed = true>>
<</if>>
<</if>>
<<if $maid.active>>
<<set $chores.bedroom = true>>
<<set $chores.kitchen = true>>
<<set $chores.livingroom = true>>
<<set $wife.choreToday = true>>
<</if>>
/* Reset daily interaction flags */
<<set $wife.talkedToday = false>>
<<set $wife.intimacyToday = false>>
<<set $wife.lastInteraction = "">>
<<set $wife.spiedToday = false>>
<<set $wife.bathroomViewedToday = false>>
<<set $wife.talkTopic = "">>
<<set $wife.cookedToday = false>>
<<set $wife.tipsy = false>>
<<set $wife.wineToday = false>>
<<set $wife.dateToday = false>>
<<set $wife.arousalNoticedToday = false>>
<<set $wife.yogaViewedToday = false>>
<<set $wife.outingResolved = false>>
<<set $wife.outForDay = false>>
<<set $wife.lazyMorningToday = false>>
<<set $wife.affectionToday = false>>
<<set $wife.wardrobeSeen = false>>
<<set $wife.choreToday = false>>
<<set $wife.careToday = false>>
/* Rent due on Sunday (may override mood) */
<<if $weekday == 7>>
<<rentCheck>>
<</if>>
/* Infidelity: decay + discovery roll (may override mood) */
<<suspicionCheck>>
/* Marriage endgame: ultimatum and divorce (may end the game) */
<<marriageCheck>>
/* Recklessness: drink/fighting worry and the scold (may hit relationship) */
<<worryCheck>>
/* Ex Check: Will the ONS text you? */
<<exCheck>>
/* Decide which scene greets the player on waking */
<<dayResolveMorning>>
/* Energy restore */
<<set $energy = $energyMax>>
<<set $ventedToday = false>>
<<set $foughtToday = false>>
/* Work Variables */
<<set $job.attendedToday = false>>
<<set $job.missedToday = false>>
<<set $job.distractedToday = false>>
<<set $job.wfhToday = false>>
/* Phone variables */
<<set $phone.wifeTextedToday = false>>
<<set $phone.nudeAskedToday = false>>
<<set $phone.intimacyPicToday = false>>
<<set $phone.friendTextedToday = false>>
/* Lingerie selfie: a few days after the shopping date, she sends a flirty,
teasing (not nude) selfie in the set you bought. Routes through the wife-photo
pipeline. If another photo is already pending, it waits a day and fires next. */
<<if $wife.lingerieSelfieDay > 0 and $gameDay >= $wife.lingerieSelfieDay and not $phone.wifeUnread>>
<<set _ling = []>>
<<for _i = 1; _i <= 6; _i++>>
<<set _ling.push("w_phone_ling" + _i + ".jpeg")>>
<</for>>
<<set $phone.wifePendingImg = _ling.random()>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifeMsgType = "lingerie">>
<<set $wife.lingerieSelfieDay = 0>>
<</if>>
/* Wife-initiated nude: a quiet surprise at high relationship */
<<set _nudeOk = $wife.relationship >= 60 and $gameDay >= $intimacyUnlockDay and ($gameDay - $phone.lastNudeDay) >= $phone.nudeCooldown>>
<<if _nudeOk and not $phone.wifeUnread and random(1, 100) <= 20>>
<<set _nudes = []>>
<<for _i = 1; _i <= 11; _i++>>
<<set _nudes.push("w_phone_n" + _i + ".jpeg")>>
<</for>>
<<set _nudes = _nudes.filter(f => f !== $phone.lastNudeImg)>>
<<set _pick = _nudes.random()>>
<<set $phone.lastNudeImg = _pick>>
<<set $phone.wifeUnread = true>>
<<set $phone.wifePendingImg = _pick>>
<<set $phone.lastNudeDay = $gameDay>>
<</if>>
/* Friend-initiated text: he reaches out first now and then. 4-day cooldown so
he won't text two days running, 40% roll on eligible days. Fri/Sat the pool
leans toward an Anchor nudge, since that's when he's actually on his stool. */
/* A "come to the Anchor tonight" invite is time-sensitive. If it went
unanswered, drop it before today's roll rather than letting it sit stale.
Evergreen pings (checkin, memory, ribbing, lowkey) persist until replied. */
<<if $phone.friendPingTopic == "anchor">>
<<set $phone.friendPingTopic = "">>
<<set $phone.friendUnread = false>>
<</if>>
<<set _friendOk = ($gameDay - $phone.lastFriendPing) >= $phone.friendCooldown>>
<<if _friendOk and not $phone.friendUnread and random(1, 100) <= 40>>
<<set _pingPool = ["checkin", "memory", "ribbing", "lowkey"]>>
<<if $weekday == 5 or $weekday == 6>>
<<run _pingPool.push("anchor", "anchor")>>
<</if>>
<<set $phone.friendPingTopic = _pingPool.random()>>
<<set $phone.friendUnread = true>>
<<set $phone.lastFriendPing = $gameDay>>
<</if>>
/* Other variables */
<<set $friend.drankToday = false>>
<<set $onsToday = false>>
<</widget>>
/* END OF: DAYSHIFT */<<widget "fitnessFeedback">>
<<if $fitnessTierUp>>
<span class="good">Fitness level increased.</span><br>
<<set $fitnessTierUp = false>>
<</if>>
<<if $fitnessTierDown>>
<span class="bad">Fitness level dropped.</span><br>
<<set $fitnessTierDown = false>>
<</if>>
<<if $fitnessWarning>>
<span class="warning">You feel sluggish. It's been a while since you trained.</span><br>
<<set $fitnessWarning = false>>
<</if>>
<</widget>>/* BEGIN: FITNESSCHECK */
<<widget "fitnesscheck">>
/* Store previous tier */
<<set _oldTier = $fitnessTier>>
/* Determine new tier + energy */
<<if $fitness >= 45>>
<<set $fitnessTier = 5>>
<<set $energyMax = 10>>
<<elseif $fitness >= 30>>
<<set $fitnessTier = 4>>
<<set $energyMax = 9>>
<<elseif $fitness >= 20>>
<<set $fitnessTier = 3>>
<<set $energyMax = 8>>
<<elseif $fitness >= 15>>
<<set $fitnessTier = 2>>
<<set $energyMax = 7>>
<<elseif $fitness >= 10>>
<<set $fitnessTier = 1>>
<<set $energyMax = 6>>
<<else>>
<<set $fitnessTier = 0>>
<<set $energyMax = 5>>
<</if>>
/* Reset flags */
<<set $fitnessTierUp = false>>
<<set $fitnessTierDown = false>>
/* Detect direction */
<<if $fitnessTier > _oldTier>>
<<set $fitnessTierUp = true>>
<<elseif $fitnessTier < _oldTier>>
<<set $fitnessTierDown = true>>
<</if>>
<</widget>>
/* BEGIN: FITNESSCHECK */
/* START: RENT CHECK */
<<widget "rentCheck">>
<<if $money >= $rent>>
<<set $money -= $rent>>
<<set $rentResult = "paid">>
<<elseif !$wife.bailedOut>>
<<set $wife.bailedOut = true>>
<<set $wife.relationship -= 5>>
<<set $wife.mood = -3>>
<<set $rentResult = "bailed">>
<<else>>
<<set $rentResult = "gameover">>
<<set $gameOverCause = "rent">>
<<set $gameRunning = false>>
<<goto "Game Over">>
<</if>>
<</widget>>
/* END: RENT CHECK */
/* START: RENT FEEDBACK */
<<widget "rentFeedback">>
<<if $rentResult == "paid">>
<span class="good">Rent paid: $<<print $rent>>.</span>
<br>
<<elseif $rentResult == "bailed">>
<span class="warning">Ashley covered the rent. She won't do it again.</span>
<br>
<</if>>
<<set $rentResult = null>>
<</widget>>
/* END: RENT FEEDBACK */
/* START: MAID FEEDBACK */
<<widget "maidFeedback">>
<<if $maid.billedThisWeek > 0>>
<span class="warning">Cleaning service billed: $<<print $maid.billedThisWeek>>.</span><br>
<<set $maid.billedThisWeek = 0>>
<</if>>
<<if $maid.lapsed>>
<span class="bad">You couldn't cover the cleaning service. It's been cancelled.</span><br>
<<set $maid.lapsed = false>>
<</if>>
<</widget>>
/* END: MAID FEEDBACK */
/* START: WIFE MOOD SHIFT */
/* Usage:
<<moodShift 1>> mood +1, no relationship change
<<moodShift -1 -2>> mood -1 AND relationship -2
<<moodShift 1 1>> mood +1 AND relationship +1
*/
<<widget "moodShift">>
<<set $wife.mood += _args[0]>>
<<if _args.length > 1>>
<<set $wife.relationship += _args[1]>>
<</if>>
<<if $wife.mood > 3>><<set $wife.mood = 3>><</if>>
<<if $wife.mood < -3>><<set $wife.mood = -3>><</if>>
<</widget>>
/* END: WIFE MOOD SHIFT */
/* START: WIFE MOOD RESET (called on dayshift) */
<<widget "moodReset">>
<<if $wife.relationship >= 60>>
<<set $wife.mood = 2>>
<<elseif $wife.relationship >= 25>>
<<set $wife.mood = 1>>
<<elseif $wife.relationship >= 0>>
<<set $wife.mood = 0>>
<<elseif $wife.relationship >= -10>>
<<set $wife.mood = -1>>
<<else>>
<<set $wife.mood = -2>>
<</if>>
<</widget>>
/* END: WIFE MOOD RESET */
/* START: SOLO VENT WIDGET */
/* Usage: drop <<soloVent "bedroom">> into a room passage.
The arg is the wife-location key for THIS room, so the widget
knows when she's present and the option should hide. */
<<widget "soloVent">>
<<set _here = _args[0]>>
<<if $arousal >= 3 and $wife.location !== _here and not $ventedToday>>
<<if $energy < 1>>
<br>//You're too drained to jerk off right now.//
<<else>>
<br><<link "Jerk off to some porn." "Solo Vent">><</link>>
<</if>>
<</if>>
<</widget>>
/* END: SOLO VENT WIDGET */
/* START: WEEKEND OUTING */
<<widget "weekendOuting">>
/* Saturday emergency callout: rare branch that pre-empts the outing.
Same time slot and resolution gates as the outing itself; the random
roll sits last so it only fires when everything else already passed. */
<<if $weekday == 6 and $time == 2 and not $wife.outingResolved and not $wife.outForDay and not $job.calloutPending and ($gameDay - $job.lastCalloutDay) >= $job.calloutCooldown and random(1, 100) <= 10>>
<<set $job.calloutPending = true>>
<<set $job.lastCalloutDay = $gameDay>>
<<goto "Weekend Helion Callout">>
<<else>>
<<if $weekday >= 6 and $time == 2 and not $wife.outingResolved>>
<<if $wife.mood <= -2 or $wife.relationship < 0>>
/* Excluded: she takes him out without you. */
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<<set $wife.location = "out">>
$wife.name is getting your son ready to go out, coat and little shoes by the door. She doesn't ask if you want to come. By the time you've thought of something to say, the door has already shut behind them.
<br>
<span class="warning">They've gone out without you.</span>
<br><br>
<<elseif $energy < 1>>
/* Offered, but you're too drained to join. */
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<<set $wife.location = "out">>
$wife.name is taking the boy out for the afternoon and asks if you're coming. You're running on empty, and she reads it on you before you've finished the excuse. She lets it go and takes him without you.
<br><br>
<<else>>
/* She comes to ask, in her own passage. */
<<goto "Weekend Outing Ask">>
<</if>>
<</if>>
<</if>>
<</widget>>
/* END: WEEKEND OUTING */
/* START: FRIEND DRINK */
<<widget "friendDrinkSetup">>
<<set $friend.drankToday = true>>
<<set $money -= 16>>
<<set $time = Math.min($time + 2, $timeMax)>>
<<set $drunk += 2>>
<<set $friend.relationship += 2>>
<<set _topics = ["old", "startup", "work", "ashley", "sports", "checkin"]>>
<<if $onsEver>><<set _topics.push("cheat_ons")>><</if>>
<<if $swEver>><<set _topics.push("cheat_sw")>><</if>>
<<if $swEver>>
<<set _topics.push("sw_suggest")>>
<<set _topics.push("sw_suggest")>>
<</if>>
<<set $friend.topic = _topics.random()>>
<<for _i = 0; $friend.topic === $friend.lastTopic and _i < 5; _i++>>
<<set $friend.topic = _topics.random()>>
<</for>>
<<set $friend.lastTopic = $friend.topic>>
<</widget>>
/* END: FRIEND DRINK */
/* START: MORNING SCENE ARBITER */
/* Single authority on which scene greets the player on waking.
Reads flags already set by the daily checks and applies priority
once. Highest priority first; exactly one wins. To add a new
morning claimant, insert one line at the correct rung. */
<<widget "dayResolveMorning">>
<<if $wife.discoveryToday>>
<<set $morningScene = "Wife Discovery">>
<<elseif $wife.ultimatumToday>>
<<set $morningScene = "Wife Ultimatum">>
<<elseif $wife.worryScoldToday>>
<<set $morningScene = "Wife Worry">>
<<else>>
<<set $morningScene = "Bedroom">>
<</if>>
<</widget>>
/* END: MORNING SCENE ARBITER */<<widget "meter">>
/*
USAGE:
<<meter $energy $energyMax "Energy">>
OTHER EXAMPLES:
<<meter $fitness 45 "Fitness" "#FF9F40">>
<<meter $job.performance 20 "Promotion" "#3D73FC">>
<<meter $wife.relationship 50 "Ashley" "#FF9FB2">>
*/
<<set _current = Math.max(0, _args[0])>>
<<set _max = Math.max(1, _args[1])>>
<<set _label = _args.length > 2 ? _args[2] : "">>
<<set _color = _args.length > 3 ? _args[3] : "#6C9F56">>
<<set _pct = Math.floor((Math.min(_current, _max) / _max) * 100)>>
<<set _style = "width: " + _pct + "%; background: " + _color + ";">>
<div class="meter">
<div class="meter-fill" @style="_style"></div>
<span class="meter-text"><<= _label>> <<= _current>>/<<= _max>></span>
</div>
<</widget>><<widget "wifeSchedule">>
/* If she went out without you, she stays out until she's back in the early evening. Checked before the schedule so it overrides the time slot. */
<<if $wife.outForDay and $time < 5>>
<<set $wife.location = "out">>
<<else>>
/* Normal Schedule */
<<switch $time>>
/* Early Morning */
<<case 0>>
<<if $weekday >= 6>>
<<set $wife.location = "bedroom">>
<<else>>
<<set $wife.location = "kitchen">>
<</if>>
/* Late Morning */
<<case 1>>
<<if $weekday >= 6>>
<<set $wife.location = "kitchen">>
<<else>>
<<set $wife.location = "bathroom">>
<</if>>
/* Noon */
<<case 2>>
<<if $weekday >= 6>>
<<set $wife.location = "bathroom">>
<<else>>
<<set $wife.location = "out">>
<</if>>
/* Early Afternoon */
<<case 3>> <<set $wife.location = "out">>
/* Late Afternoon */
<<case 4>> <<set $wife.location = "out">>
/* Early Evening */
<<case 5>> <<set $wife.location = "kitchen">>
/* Evening */
<<case 6>> <<set $wife.location = "livingroom">>
/* Late Evening */
<<case 7>> <<set $wife.location = "bedroom">>
/* Night */
<<case 8>> <<set $wife.location = "bedroom">>
<</switch>>
<</if>>
/* Yoga sessions (requires mats): Wednesday late afternoon, Saturday late morning.
Overrides her normal location and flags the session for the living room.
doingYoga is recomputed every load, so it self-clears outside the slots. */
<<set $wife.doingYoga = false>>
<<if $items.yogaMats>>
<<if ($weekday == 3 and $time == 4) or ($weekday == 6 and $time == 1)>>
<<set $wife.location = "livingroom">>
<<set $wife.doingYoga = true>>
<</if>>
<</if>>
/* Wardrobe malfunction: rolled once per game day, cached for the night.
Only ever surfaces at Night (time 8) in the bedroom scene. Tune the rate. */
<<if $wife.wardrobeRollDay !== $gameDay>>
<<set $wife.wardrobeRollDay = $gameDay>>
<<set $wife.wardrobeMalfunction = (random(1, 100) <= 35)>>
<</if>>
/* Living-room tidying: rolled once per game day, cached. Only ever surfaces in
the evening living-room slot when she isn't doing yoga, and is consumed the
first time the player walks in on it. Tune the rate. */
<<if $wife.tidyRollDay !== $gameDay>>
<<set $wife.tidyRollDay = $gameDay>>
<<set $wife.tidyToday = (random(1, 100) <= 35)>>
<</if>>
/* Monthly cycle: a short window where sex is off the table (HJ/BJ depend on
relationship). Deterministic from $gameDay so it's consistent within a cycle;
cycleStart is randomized at game start so it isn't the same days every
playthrough. Recomputed each load, no caching needed. Tune the window (4) and
period (28). */
<<set _cyclePos = ($gameDay - $wife.cycleStart) % 28>>
<<if _cyclePos < 0>><<set _cyclePos += 28>><</if>>
<<set $wife.cycleOff = (_cyclePos < 4)>>
<</widget>>/* START OF: WORKOUT WIDGET */
/* Usage:
<<workout "Go for a swim.">>
<<workout "Lift weights." 2 2>>
(label, energyCost, timeCost)
*/
<<widget "workout">>
<<set _label = _args[0]>>
<<set _energyCost = _args.length > 1 ? _args[1] : 1>>
<<set _timeCost = _args.length > 2 ? _args[2] : 1>>
<<set _fitnessGain = _args.length > 3 ? _args[3] : 1>>
<<set _moneyCost = _args.length > 4 ? _args[4] : 0>>
<<set _arousalRelief = _args.length > 5 ? _args[5] : 0>>
<<if $arousal >= 8>>
//You can't focus on training while this horny.//
<<elseif $lastWorkoutDay == $gameDay>>
//You've already trained today.//
<<elseif $energy < _energyCost>>
//You're too exhausted to train right now.//
<<elseif $time >= $timeMax>>
//It's too late to get a proper workout in now.//
<<elseif $money < _moneyCost>>
//You can't afford a session right now.//
<<else>>
<<link _label $return>>
<<set $energy = Math.max($energy - _energyCost, 0)>>
<<set $time = Math.min($time + _timeCost, $timeMax)>>
<<set $money -= _moneyCost>>
<<set $fitness += _fitnessGain>>
<<set $arousal = Math.max($arousal - _arousalRelief, 0)>>
<<set $lastWorkoutDay = $gameDay>>
<<set $fitnessWarningShown = false>>
<</link>>
<</if>>
<</widget>>
/* END OF: WORKOUT WIDGET *//* START OF: CHORE WIDGET */
/* Usage: <<chore "bedroom" "Tidy the bedroom.">> */
<<widget "chore">>
<<set _room = _args[0]>>
<<set _label = _args[1]>>
<<if !$chores[_room] and $arousal >= 8>>
//You're too horny to focus on this right now.//
<<elseif !$chores[_room] and $energy < 1>>
//You're too tired to do chores.//
<<elseif !$chores[_room] and $time >= $timeMax>>
//It's too late to start cleaning now.//
<<elseif !$chores[_room]>>
<<link _label $return>>
<<set $time = Math.min($time + 1, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $chores[_room] = true>>
<<choreCredit>>
<<moodShift 1>>
<</link>>
<<else>>
/* Nothing */
<</if>>
<</widget>>
/* END OF: CHORE WIDGET */
/* START: WIFE CREDIT (two tracks, same mechanics) */
/* UPKEEP. Called by <<chore>> and by the maid's daily auto-clean.
Keeps the house standing. She notices when it stops. */
<<widget "choreCredit">>
<<set $wife.choreToday = true>>
<<set $wife.choreCounter += 1>>
<<if $wife.choreCounter >= 4>>
<<set $wife.choreCounter = 0>>
<<if $wife.relationship < 50>>
<<set $wife.relationship += 1>>
<<set $wife.choreThanks = true>>
<</if>>
<</if>>
<</widget>>
/* CARE. Cooking, breakfast together, lazy mornings, holding her.
Nothing to do with the dishes. She notices when this stops too,
and it's the one the cleaning service can never buy. */
<<widget "careCredit">>
<<set $wife.careToday = true>>
<<set $wife.careCounter += 1>>
<<if $wife.careCounter >= 4>>
<<set $wife.careCounter = 0>>
<<if $wife.relationship < 50>>
<<set $wife.relationship += 1>>
<<set $wife.careThanks = true>>
<</if>>
<</if>>
<</widget>>
/* END: WIFE CREDIT */<<widget "exCheck">>
/* Runs once per dayshift. A few days after she gets your number,
a text queues up. Tune the 3-day delay and the 45% roll. */
<<if $ex.live and not $ex.pending and ($gameDay - $ex.day) >= 3>>
<<if random(1, 100) <= 45>>
<<set $ex.pending = true>>
<</if>>
<</if>>
<</widget>>
<<widget "exPing">>
/* _args: this room's wife-location key.
With her in the room, it's a scare. Alone, once you've kept the
number, it's the second-round text. */
<<if $ex.pending>>
<<if $ex.saved>>
<<goto "ONS Ex Opportunity">>
<<elseif $wife.location == _args[0]>>
<<goto "ONS Ex Scare">>
<</if>>
<</if>>
<</widget>>
<<widget "galleryAdd">>
/* _args[0] = full image path, _args[1] = caption.
Dedupes by path: an image already in the gallery is never stored twice. */
<<if not $phone.gallery.some(g => g.img === _args[0])>>
<<set $phone.gallery.push({img: _args[0], caption: _args[1], day: $gameDay})>>
<<set $phone.galleryNew += 1>>
<</if>>
<</widget>>/* TIME OF DAY */
<<widget "timeofday">>
<<switch $time>>
<<case 0>>Early Morning
<<case 1>>Late Morning
<<case 2>>Noon
<<case 3>>Early Afternoon
<<case 4>>Late Afternoon
<<case 5>>Early Evening
<<case 6>>Evening
<<case 7>>Late Evening
<<case 8>>Night
<</switch>>
<</widget>>
/* WEEKDAY */
<<widget "weekday">>
<<switch $weekday>>
<<case 1>>Monday
<<case 2>>Tuesday
<<case 3>>Wednesday
<<case 4>>Thursday
<<case 5>>Friday
<<case 6>>Saturday
<<case 7>>Sunday
<</switch>>
<</widget>>
/* START: DATETIME DISPLAY */
<<widget "datetime">>
<<weekday>> - <<timeofday>>
<</widget>>
/* END: DATETIME DISPLAY */
/* START: TIMELINK */
/*
<<timelink "Text" "Passage" cost>>
Creates a link that advances time by a set amount (cost)
before moving to another passage.
- cost = number of time phases added (0–6 total)
- Automatically blocks usage at Night
- Clamps time so it never exceeds Night
*/
<<widget "timelink">>
<<if $time >= $timeMax>>
<span class="disabled"> <<= _args[0] >> (too late)</span>
<<else>>
<<link _args[0]>>
<<set $time += _args[2]>>
<<if $time > $timeMax>><<set $time = $timeMax>><</if>>
<<goto _args[1]>>
<</link>>
<</if>>
<</widget>>
/* END: TIMELINK *//* START: WIFE REACTIONS */
<<widget "wifeReact">>
/* Scold: the house */
<<if $wife.choreScold>>
<<set _l = [
"I came home to the sink again. I work a full shift and then I clean up after all three of us, and I can't keep doing it and pretending I don't mind.",
"Do you actually see it? The mess. Or does it just not register until I've dealt with it.",
"I'm not your mother. I've got a job and a four-year-old and somehow I've also got you. How hard can it be to help out with the housework?"
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.choreScold = false>>
<<set $wife.careScold = false>>
/* Scold: the distance */
<<elseif $wife.careScold>>
<<set _l = [
"You've been here all week. In the flat, I mean. I don't think you've actually looked at me once. Why aren't talking anymore?",
"We haven't had a real conversation in days. You should focus more on us. You're in the room and you're not in the room.",
"We never do anything together. I'd rather you shouted at me than this. At least then I'd know you'd noticed I was here."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.careScold = false>>
/* Interaction responses */
<<elseif $wife.lastInteraction == "talked">>
<<switch $wife.talkTopic>>
<<case "kid">>
<<speech "You" $name>>
He's getting big, isn't he. Feels like it happened while I wasn't looking.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
He is. Got your stubborn streak, God help me. Plants his feet exactly the way you do when he's decided something.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
He is. And he notices more than you'd think. Worth remembering, next time you assume he doesn't.
<</speech>>
<</if>>
<<case "past">>
<<speech "You" $name>>
Remember that first apartment we got after college? The one with the screaming boiler.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
God, that place. We put a mattress on the floor and called it furnished. Broke as anything. I don't think I've been happier since.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Don't. I can't do the good-old-days thing right now. It just makes this one look worse.
<</speech>>
<</if>>
<<case "plans">>
<<speech "You" $name>>
You ever think about what's next? For us, I mean.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I don't know. Smaller plans than I used to make. But not none. That's something.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Plans. Right. Let's just get through the month first, and then we'll dream big.
<</speech>>
<</if>>
<<case "cheer">>
<<speech "You" $name>>
So. Reckon you can still pull off any of those cheerleader moves, or is that strictly a museum piece now?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Watch it. I could still put my foot above your head, and don't think I won't demonstrate on the wrong part of you.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
That girl had a flat stomach and a future. Let's not poke at her.
<</speech>>
<</if>>
<<case "castings">>
<<speech "You" $name>>
Do you ever miss it? The auditions, the castings, all that.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I miss the work. Not the rest. Half those rooms were some sweaty producer telling me to "loosen up" with the door shut. You learn to keep your back to a wall.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Miss being looked up and down by men who'd "see what they could do" for me? No. I got very good at the polite no and the fast exit. That's the part nobody puts on a headshot.
<</speech>>
<</if>>
<<case "sofa">>
<<speech "You" $name>>
You still thinking about that sofa you showed me? The gray one.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I am, actually. Ours has a spring that's basically trying to escape. But it can wait. I know money's money right now.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Forget the sofa. I shouldn't have brought it up. We can't, and we both know it.
<</speech>>
<</if>>
<<case "shower">>
<<speech "You" $name>>
That showerhead's still dripping, you know. Drives me up the wall.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
So fix it, big man. You used to be handy, somewhere under all that. I'll even pretend to be impressed.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
And? You're the man of the house, supposedly. Or do we wait for it to flood and call someone we can't pay?
<</speech>>
<</if>>
<<case "shape">>
<<speech "You" $name>>
I've been trying to get back in shape. Noticing any difference?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
A bit, actually. You stand differently. I clocked it before you said anything, if that tells you something.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Trying. Okay. Ask me again when there's something to notice.
<</speech>>
<</if>>
<<case "restaurant">>
<<speech "You" $name>>
You never talk about the restaurant. How is it, really?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Loud. Hot. The owner's nephew treats the schedule as a suggestion, so I cover his shifts and he gets the thanks. But the girls are good. We laugh. It's mine, at least, the bit of it that is.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
It's a floor and a lot of plates. It pays for the daycare that lets me work it. Round and round. Let's not.
<</speech>>
<</if>>
<<case "boxing">>
<<speech "You" $name>>
I've been thinking about the ring again. Not just the bag down at Vance's. The real thing.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
There he is. You used to talk about that with your whole face. Go on then, get your nose broken. I'll pretend to disapprove and secretly like it.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Another comeback. The ring, the company, the grand plan. I married a man with a whole drawer of them. Show me one that finished.
<</speech>>
<</if>>
<<case "startup">>
<<speech "You" $name>>
I still run the company through my head sometimes. The parts I'd do differently.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I know you do. I catch you at it across the table. I never thought you were a fool for trying. Just for doing it with your back to your own front door.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I can't go back there with you. I'm still living in what it cost. You get to replay it, I get to pay for it. That's the deal we ended up with.
<</speech>>
<</if>>
<<case "affection">>
<<speech "You" $name>>
I don't say it enough. That I'm glad it's still you and me here.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
No, you don't. But you said it now, and I'll take the now. Don't make me wait so long for the next one.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Glad. Right. You've a funny way of showing it most days. But... noted.
<</speech>>
<</if>>
<<case "coffee">>
<<speech "You" $name>>
We're nearly out of the decent coffee. The bag you hide behind the lentils.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
You found it. Of course you found it. Fine, we ration it. One proper cup each on Sundays, like people with their lives together.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
So we drink the cheap stuff. It's not like we're hosting anyone. Save the good bag for a day that earns it.
<</speech>>
<</if>>
<<case "reality">>
<<speech "You" $name>>
Wait, which one's that, the one with the sex tape or the one with the make-up empire? They all blur into one.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
The make-up one. The tape was the older sister, do keep up. For a man who can untangle code nobody else can read, you cannot hold three famous women apart to save your life.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Does it matter? They're famous for being famous. I'm not your search engine for people neither of us will ever meet.
<</speech>>
<</if>>
<<case "canal">>
<<speech "You" $name>>
Saw a backpack just floating in the canal on the way back. Makes you wonder what's in it.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Oh, that's a body. That's episode one. Jogger finds a bag, ominous narrator, and forty minutes later it's always the quiet husband. Always. You'd be perfect for the reenactment, you've got the face for it.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Probably some kid's gym clothes. Not everything's a mystery. Some things are just rubbish in the water, like most things around here.
<</speech>>
<</if>>
<<case "series">>
<<speech "You" $name>>
Are we ever finishing that series, or is it just going to sit at three-episodes-in forever?
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
We are finishing it. I've decided the brother did it and I need to be proved right. Tonight, once he's down. You make the tea, I'll fight you for the good end of the sofa.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
When, exactly? You're never on the sofa when I am, and when you are you're asleep in ten minutes. Watch it without me. Or don't.
<</speech>>
<</if>>
<<case "documentary">>
<<speech "You" $name>>
There was a documentary on about people who just walk away from their whole lives. Vanish, start again somewhere new.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Tempting, isn't it. I price it up some days. New name, a town by the sea, nobody who knows me. Then he shouts for me from the other room and that's that. You're stuck with me, sorry.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I caught a bit of it. Don't go reading anything into which bit.
<</speech>>
<</if>>
<<case "takeout">>
<<speech "You" $name>>
What I wouldn't give for a proper takeout tonight. The good place, not the one where everything's beige.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Don't, my stomach just filed a complaint. One day we get the good place, all the extra sides, and we don't even look at the prices. I'm picturing it. Vividly.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
We're not getting a takeout and you know it. Saying it out loud just makes the lentils taste worse.
<</speech>>
<</if>>
<<case "neighbor">>
<<speech "You" $name>>
The pair upstairs were going again this morning. Kid and the thumping, six on the dot.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Our little alarm clock. At least ours sleeps to seven now, small mercies. I keep meaning to actually meet them. Shared a ceiling for months and I couldn't pick them out of a lineup.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
And what would you like me to do about the neighbors? Add it to the list of things that are nobody's fault and somehow still mine.
<</speech>>
<</if>>
<<case "dream">>
<<speech "You" $name>>
You were talking in your sleep last night. Full sentences. Something about a swan.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I was not. Was I? God, what did I say, because if I'm narrating my dreams to you now I'd like to know what I'm working with. A swan. Wonderful. Very normal wife you landed.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Was I. I probably get more said asleep than I manage awake in this place. Wouldn't take much.
<</speech>>
<</if>>
<<case "lottery">>
<<speech "You" $name>>
If a stupid amount of money landed tomorrow, no strings. First thing you'd do.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Easy. Sleep. A solid week of it, in a bed nobody climbs on at dawn. Then the coast, the good coffee, a door that locks. I've had this list a long while, if that wasn't obvious.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I don't play that game anymore. We did 'imagine when we're rich' for years, and look where the imagining landed us. I deal in what's in the account now.
<</speech>>
<</if>>
<<case "music">>
<<speech "You" $name>>
That song came on at the store the other day. The one that was always on, back then. Stood in the cereal aisle like an idiot.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Ours. The one you butchered at that party, and somehow I still went home with you. Can't hear it without smelling cheap vodka. Best worst night of my life. Hum it and I'll deny all of this.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
A song's a song. I can't go misty over a jingle with the rent where it is. Nice you've got the spare attention for it, though.
<</speech>>
<</if>>
<<default>>
<<speech "You" $name>>
No reason. Just felt like talking.
<</speech>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
Mm. It's been a while since we just talked like this.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Yeah. Sure.
<</speech>>
<</if>>
<</switch>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_fail">>
<<if $wife.mood <= -2>>
<<speech "Wife" $wife.name>>
Don't even think about it.
<</speech>>
<<elseif $wife.mood <= -1>>
<<speech "Wife" $wife.name>>
Really? Right now?
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Not now. I'm not feeling it.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_cold">>
<<speech "Wife" $wife.name>>
Not right now. It's been a day.
<</speech>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_notyet">>
<<speech "Wife" $wife.name>>
Mm... I'm not there with you yet. I want to want it, I do, but we're not back to that. Keep showing up for me and we'll see.
<</speech>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_spent">>
<<if $wife.relationship >= 60>>
<<speech "Wife" $wife.name>>
Mm, give me a little to recover first. You'll have me again soon enough.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Not again so soon. I'm not a switch you get to flip whenever you want.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_period">>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
I'm on my period, love. Cramping, exhausted, the whole show. Ask me again in a few days and I'll be a lot more fun.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
I'm on my period, I've had four hours' sleep, and that's where your head goes? Read the fucking room.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "advance_tooSoon">>
<<speech "Wife" $wife.name>>
Hey... not yet. I'm not in that place with you right now. We need to work more on us first.
<</speech>>
<<set $wife.lastInteraction = "">>
<<elseif $wife.lastInteraction == "affection_refuse">>
<<if $wife.mood <= -2>>
<<speech "Wife" $wife.name>>
Don't. I'm not in the mood to be touched right now.
<</speech>>
<<else>>
<<speech "Wife" $wife.name>>
Not right now. I just... not right now.
<</speech>>
<</if>>
<<set $wife.lastInteraction = "">>
/* Thanks: the house */
<<elseif $wife.choreThanks and $wife.mood >= 0>>
<<set _l = [
"The place has been... nice, lately. I keep walking in and there's nothing waiting for me. You've no idea what that's worth.",
"I came home to a clean kitchen. Twice this week. I nearly checked I was in the right flat.",
"You've been picking up after him without being asked. I noticed, and it means a lot to me."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.choreThanks = false>>
<<elseif $wife.choreThanks>>
<<set $wife.choreThanks = false>>
/* Thanks: the closeness */
<<elseif $wife.careThanks and $wife.mood >= 0>>
<<set _l = [
"You've been different lately. More present. I noticed a while ago, I just didn't want to say it out loud in case it stopped.",
"We've been talking with each other again. Properly, I mean. I'd forgotten what that was like.",
"We've been closer lately. Whatever it is you're doing, don't stop. That's all. That's the whole speech."
]>>
<<speech "Wife" $wife.name>><<= _l.random()>><</speech>>
<<set $wife.careThanks = false>>
<<elseif $wife.careThanks>>
<<set $wife.careThanks = false>>
/* High arousal: she clocks that you're somewhere else */
<<elseif $arousal >= 7 and not $wife.arousalNoticedToday>>
<<set $wife.arousalNoticedToday = true>>
<<if $wife.mood >= 1>>
<<speech "Wife" $wife.name>>
You're somewhere else today. I can tell. You get this look.
<</speech>>
<<elseif $wife.mood >= -1>>
<<speech "Wife" $wife.name>>
Why are you looking at me up and down like that, weirdo?
<</speech>>
<<moodShift -1>>
<<else>>
<<speech "Wife" $wife.name>>
Don't look at me like that. I'm not some piece of meat.
<</speech>>
<<moodShift -1 -1>>
<</if>>
<</if>>
<br>
<</widget>>
/* END: WIFE REACTIONS */
/* START: WIFE SUSPICION */
/* Register a physical infidelity. Severity scales the suspicion gain.
Suggested: HJ 1, BJ 2, sex 3. Office tryst 2.
Re-arms the discovery system (lifts the lockout). */
<<widget "addSuspicion">>
<<set _amt = _args.length > 0 ? _args[0] : 1>>
<<set $wife.suspicion += _amt>>
<<set $wife.cheatedToday = true>>
<<set $wife.suspicionLocked = false>>
<</widget>>
/* Daily: decay on faithful days, then roll for discovery.
Called once inside dayshift. */
<<widget "suspicionCheck">>
/* Clear yesterday's discovery state */
<<set $wife.discoveryToday = false>>
<<set $wife.discoveryResult = 0>>
/* Decay if no infidelity since the last dayshift */
<<if not $wife.cheatedToday>>
<<set $wife.suspicion = Math.max($wife.suspicion - 1, 0)>>
<</if>>
<<set $wife.cheatedToday = false>>
/* Discovery roll: only if armed and there is something to find */
<<if not $wife.suspicionLocked and $wife.suspicion > 0>>
<<set _chance = Math.max(0, Math.min(90, ($wife.suspicion * 6) - ($wife.relationship * 0.4)))>>
<<if random(1, 100) <= _chance>>
<<set _hit = Math.max(5, Math.min(25, 5 + $wife.suspicion))>>
<<set $wife.relationship -= _hit>>
<<set $wife.suspicion = Math.floor($wife.suspicion / 2)>>
<<set $wife.suspicionLocked = true>>
<<set $wife.mood = -3>>
<<set $wife.discoveryResult = _hit>>
<<set $wife.discoveryToday = true>>
<</if>>
<</if>>
<</widget>>
/* END: WIFE SUSPICION */
/* START: WIFE WORRY */
/* Register reckless, self-destructive behaviour. Severity scales the gain.
Suggested: bare-knuckle fight 2. Drinking flows through $drunk, not here. */
<<widget "addWorry">>
<<set _amt = _args.length > 0 ? _args[0] : 1>>
<<set $wife.worry += _amt>>
<<set $wife.recklessToday = true>>
<</widget>>
/* Daily: she reads the state you came home in, worry decays on clean days,
then she may finally say something. Called once inside dayshift. */
<<widget "worryCheck">>
/* Clear yesterday's scold scene flag */
<<set $wife.worryScoldToday = false>>
<<set $wife.worryResult = 0>>
/* She can tell when you've been drinking. Heavier nights land harder.
addWorry also sets recklessToday, so a drunk night won't then decay. */
<<if $drunk >= 4>>
<<addWorry 2>>
<<elseif $drunk >= 2>>
<<addWorry 1>>
<</if>>
<<set $drunk = 0>>
/* Decay on a clean, sober day */
<<if not $wife.recklessToday>>
<<set $wife.worry = Math.max($wife.worry - 1, 0)>>
<</if>>
<<set $wife.recklessToday = false>>
/* Fed up: a scold and a relationship hit, deliberately smaller than a
discovery. Deferred if a heavier confrontation is already playing today,
so worry stays intact and fires cleanly on the next eligible morning. */
<<if $wife.worry >= 6 and not $wife.discoveryToday and not $wife.ultimatumToday>>
<<set _hit = Math.max(3, Math.min(8, Math.floor($wife.worry / 2)))>>
<<set $wife.relationship -= _hit>>
<<set $wife.worry = Math.floor($wife.worry / 2)>>
<<set $wife.mood = -2>>
<<set $wife.worryResult = _hit>>
<<set $wife.worryScoldToday = true>>
<</if>>
<</widget>>
/* END: WIFE WORRY */
/* START: MARRIAGE ENDGAME */
<<widget "marriageCheck">>
/* Clear yesterday's one-day scene flag */
<<set $wife.ultimatumToday = false>>
/* Ongoing pressure once the warning has landed: a slow bleed so a marriage
parked at rock bottom keeps sliding toward divorce instead of stalling
forever in the -30 to -40 band. Applied before the threshold checks so it
can be the thing that tips the divorce. Tune the -1 to taste. */
<<if $wife.ultimatumShown and $wife.relationship > -20>>
<<set $wife.relationship -= 1>>
<</if>>
/* Terminal: the warning was given and things kept sliding. */
<<if $wife.ultimatumShown and $wife.relationship <= -20>>
<<set $gameOverCause = "divorce">>
<<set $gameRunning = false>>
<<goto "Game Over">>
/* First time at rock bottom: deliver the ultimatum and arm the divorce.
Only commit ultimatumShown when we can actually SHOW the scene. If a
discovery confrontation is already playing today, defer: leave
ultimatumShown false so this fires on the next eligible dayshift. That
guarantees the player always gets the explicit warning before divorce
is ever possible. */
<<elseif not $wife.ultimatumShown and $wife.relationship <= -10>>
<<if not $wife.discoveryToday>>
<<set $wife.ultimatumShown = true>>
<<set $wife.ultimatumToday = true>>
<<set $wife.mood = -3>>
<</if>>
/* Recovery: clawed back to safer ground, re-arm for the future. */
<<elseif $wife.ultimatumShown and $wife.relationship >= -5>>
<<set $wife.ultimatumShown = false>>
<</if>>
<</widget>>
/* END: MARRIAGE ENDGAME */
/* START: DATE */
/* Usage: <<dateStart "picnic" 15 true>> (type, cost, alcohol) */
<<widget "dateStart">>
<<set $wife.dateType = _args[0]>>
<<set $money -= _args[1]>>
<<set $wife.dateToday = true>>
<<set $wife.lastDateDay = $gameDay>>
<<set $time = Math.min($time + 2, $timeMax)>>
<<set $energy = Math.max($energy - 1, 0)>>
<<if _args[2]>>
<<set $wife.tipsy = true>>
<<set $wife.wineToday = true>>
<</if>>
<</widget>>
/* END: DATE */
/*START: WIFE INTIMACY COOLDOWN*/
/* One shared intimacy cooldown. Any act (HJ/BJ/sex) starts it; nothing is
available again until it expires. Gap shrinks as the marriage heals:
~5 days at the low end, 0 (daily) once she's fully back. Tune freely. */
<<widget "intimacyReady">>
<<if $wife.relationship >= 85>>
<<set _gap = 0>>
<<elseif $wife.relationship >= 70>>
<<set _gap = 1>>
<<elseif $wife.relationship >= 55>>
<<set _gap = 2>>
<<elseif $wife.relationship >= 40>>
<<set _gap = 3>>
<<else>>
<<set _gap = 5>>
<</if>>
<<set _ready = ($gameDay - $wife.lastIntimacyDay) >= _gap>>
<</widget>>
/*END: WIFE INTIMACY COOLDOWN*/
/* START: WIFE WARMTH (intimacy enjoyment tier) */
/* Sets _warmth: 0 reluctant, 1 warm, 2 eager.
Relationship sets the base band; mood nudges it one step either way,
so she can warm up on a good day or close off on a bad one even at the
same relationship. _args[0] and _args[1] are the relationship cutoffs
for this act (warm at >= first, eager at >= second), since each act
warms up at a different pace. */
<<widget "wifeWarmth">>
<<set _warmCut = _args[0]>>
<<set _eagerCut = _args[1]>>
/* Base band from relationship */
<<if $wife.relationship >= _eagerCut>>
<<set _w = 2>>
<<elseif $wife.relationship >= _warmCut>>
<<set _w = 1>>
<<else>>
<<set _w = 0>>
<</if>>
/* Mood nudge: a good mood can lift her a step, a sour one drops her */
<<if $wife.mood >= 2>>
<<set _w += 1>>
<<elseif $wife.mood <= -1>>
<<set _w -= 1>>
<</if>>
/* Clamp 0..2 */
<<set _warmth = Math.max(0, Math.min(2, _w))>>
<</widget>>
/* END: WIFE WARMTH *//* START: WORK CHECK */
<<widget "workCheck">>
<<if $weekday <= 5 and !$job.attendedToday and $time >= 2>>
<<set $job.daysMissed += 1>>
<<set $job.performance -= 1>>
<<set $job.attendedToday = true>>
<<set $job.missedToday = true>>
<<moodShift -1>>
/* Friday payday still triggers if missed */
<<if $weekday == 5>>
<<payday>>
<</if>>
<</if>>
<</widget>>
/* END: WORK CHECK */
/* START: PAYDAY */
<<widget "payday">>
<<set _totalDays = $job.daysWorked + $job.daysMissed>>
<<if _totalDays > 0>>
<<set _attendance = $job.daysWorked / _totalDays>>
<<else>>
<<set _attendance = 0>>
<</if>>
<<set _maxPay = $job.wage * 5>>
<<set _pay = Math.floor(_maxPay * _attendance)>>
<<set $money += _pay>>
/* Flag the result for paydayFeedback to display */
<<set $job.paidThisWeek = _pay>>
<<set $job.lastAttendance = _attendance>>
/* Reset week */
<<set $job.daysWorked = 0>>
<<set $job.daysMissed = 0>>
<<promotionCheck>>
<</widget>>
/* END: PAYDAY */
/* START: PAYDAY FEEDBACK */
<<widget "paydayFeedback">>
<<if $job.paidThisWeek !== null>>
<<if $job.lastAttendance >= 1>>
<span class="good">Payday: $<<print $job.paidThisWeek>> received for a full week.</span>
<<elseif $job.lastAttendance >= 0.6>>
<span class="warning">Payday: $<<print $job.paidThisWeek>> received (reduced).</span>
<<else>>
<span class="bad">Payday: Only $<<print $job.paidThisWeek>> after a poor week.</span>
<</if>>
<br>
<<set $job.paidThisWeek = null>>
<</if>>
<</widget>>
/* END: PAYDAY FEEDBACK */
/* START: CLOCK IN (shared by Workday and Promotion) */
<<widget "clockIn">>
<<if !$job.attendedToday>>
<<set $job.attendedToday = true>>
<<set $job.daysWorked += 1>>
/* Arousal sabotages focus: no performance gain if you came in wound up */
<<if $arousal >= 8>>
<<set $job.distractedToday = true>>
<<else>>
<<set $job.performance += 1>>
<<set $job.distractedToday = false>>
<</if>>
<<set $energy = Math.max($energy - 3, 0)>>
<<set $time = 4>>
<<if $weekday == 5>>
<<payday>>
<</if>>
/* Roll for a workday event (suppressed on promotion days) */
<<set $job.eventToday = false>>
<<set $job.eventOutcome = "">>
<<if not $job.promotionPending>>
<<set _eventChance = 20 + ($job.level * 8)>> /* tune freely: L1=28%, L5=60% */
<<if random(1, 100) <= _eventChance>>
<<set $job.eventToday = true>>
<</if>>
<</if>>
/* Roll for a draining work event. Rare, cooldowned, never on a
promotion day. Passive = silent extra energy hit, flavored at the
bottom of the Workday passage. Late = a choice offered in-passage. */
<<set $job.drainType = "">>
<<set $job.stayedLate = false>>
<<if not $job.promotionPending and ($gameDay - $job.lastDrainDay) >= $job.drainCooldown>>
<<if random(1, 100) <= 15>> /* ~15% on eligible days; tune freely */
<<set $job.lastDrainDay = $gameDay>>
<<if random(1, 100) <= 55>>
<<set $job.drainType = "passive">>
<<set $energy = Math.max($energy - 1, 0)>>
<<else>>
<<set $job.drainType = "late">>
<</if>>
<</if>>
<</if>>
<</if>>
<</widget>>
/* END: CLOCK IN */
/* START: PROMOTION CHECK (called inside payday) */
<<widget "promotionCheck">>
<<if not $job.promotionPending>>
<<set _next = $job.level + 1>>
<<set _qualified = false>>
<<switch _next>>
<<case 2>><<if $job.performance >= 10>><<set _qualified = true>><</if>>
<<case 3>><<if $job.performance >= 25>><<set _qualified = true>><</if>>
<<case 4>><<if $job.performance >= 45>><<set _qualified = true>><</if>>
<<case 5>><<if $job.performance >= 70>><<set _qualified = true>><</if>>
<</switch>>
<<if _qualified>>
<<set $job.promotionPending = true>>
<</if>>
<</if>>
<</widget>>
/* END: PROMOTION CHECK */
/* START: APPLY PROMOTION (called by the promotion event) */
<<widget "applyPromotion">>
<<set $job.level += 1>>
<<switch $job.level>>
<<case 2>>
<<set $job.title = "Software Engineer">>
<<set $job.wage = 150>>
<<case 3>>
<<set $job.title = "Senior Software Engineer">>
<<set $job.wage = 225>>
<<case 4>>
<<set $job.title = "Lead Engineer">>
<<set $job.wage = 325>>
<<case 5>>
<<set $job.title = "Engineering Manager">>
<<set $job.wage = 450>>
<</switch>>
<<set $job.promotionPending = false>>
<</widget>>
/* END: APPLY PROMOTION */
/* START: PROJECT PAYOUT FEEDBACK */
<<widget "projectPayoutFeedback">>
<<if $project.lastPayout > 0>>
<span class="good">Supporter income: $<<print $project.lastPayout>> from your project page.</span><br>
<<set $project.lastPayout = 0>>
<</if>>
<</widget>>
/* END: PROJECT PAYOUT FEEDBACK */<h2>With $wife.name</h2>
<<if $wife.mood >= 1>>
She raises an eyebrow, but there's a smile behind it.
<<speech "Wife" $wife.name>>
Alright. Where are you taking me?
<</speech>>
<<else>>
She looks at you for a moment, weighing something. Then she nods, once.
<<speech "Wife" $wife.name>>
Okay. Where?
<</speech>>
<</if>>
The girl from upstairs will watch the boy. Short notice, but for some cold cash, she always says yes.
<br><br>
''Where to?''
<br>
<<if $money >= 40>>
<<link "A picnic down by the canal. ($40)" "Wife Date Scene">>
<<dateStart "picnic" 40 true>>
<</link>>
<<else>>
//A picnic by the canal ($40), but you're short.//
<</if>>
<br>
<<if $money >= 60>>
<<link "Darts and drinks at the Anchor. ($60)" "Wife Date Scene">>
<<dateStart "bar" 60 true>>
<</link>>
<<else>>
//Darts at the Anchor ($60), but you're short.//
<</if>>
<br>
<<if $money >= 70>>
<<link "A film at the multiplex past the bypass. ($70)" "Wife Date Scene">>
<<dateStart "cinema" 70 false>>
<</link>>
<<else>>
//The multiplex ($70), but you're short.//
<</if>>
<br>
<<if $money >= 120>>
<<link "Dinner at the Italian place in town. ($120)" "Wife Date Scene">>
<<dateStart "restaurant" 120 true>>
<</link>>
<<else>>
//The Italian place ($120), but you're short.//
<</if>>
<<if $wife.relationship >= 25>>
<br>
<<if $money >= 90>>
<<link "Take her lingerie shopping in town. ($90)" "Wife Date Lingerie">>
<<dateStart "shop" 90 false>>
<</link>>
<<else>>
//Lingerie shopping in town ($90), but you're short.//
<</if>>
<</if>>
<br><br>
<<link "Maybe another night." $return>><</link>><h2>Out with $wife.name</h2>
/* Quality roll. Tune the weights here. */
<<set _score = random(1, 100) + ($wife.mood * 10) + Math.floor($wife.relationship / 4) + ($fitnessTier * 3)>>
<<if _score >= 85>>
<<set $wife.dateQuality = "great">>
<<elseif _score >= 45>>
<<set $wife.dateQuality = "good">>
<<else>>
<<set $wife.dateQuality = "flat">>
<</if>>
/* Relationship gain per type */
<<switch $wife.dateType>>
<<case "picnic">> <<set _gain = 2>>
<<case "bar">> <<set _gain = 3>>
<<case "cinema">> <<set _gain = 3>>
<<case "restaurant">><<set _gain = 4>>
<</switch>>
/* Apply outcome */
<<switch $wife.dateQuality>>
<<case "flat">>
<<set $wife.relationship += 1>>
<<case "good">>
<<set $wife.relationship += _gain>>
<<moodShift 1>>
<<case "great">>
<<set $wife.relationship += _gain + 1>>
<<set $wife.mood = 3>>
<</switch>>
/* Date image, one per location */
<div class="intro-image wide">
<img @src="'images/dates/date_' + $wife.dateType + '.jpeg'" width="100%">
</div>
<br>
/* Scene text */
<<switch $wife.dateType>>
<<case "picnic">>
<<switch $wife.dateQuality>>
<<case "flat">>
The wind comes off the water colder than it looked from the flat, and the cheap wine never quite warms either of you. She keeps her jacket zipped to the chin and answers in short, pleasant sentences, and after a while you pack the blanket up early. On the walk home she takes your arm anyway. It counts for something. Not much, but something.
<<case "good">>
You find a dry stretch of bank where the lamps give out and the water goes gold for a few minutes, as the sun sets. The wine is cheap and does its job. She tells a story about one of the girls at the restaurant, doing all the voices, and somewhere in it she leans her shoulder against yours and leaves it there.
<<case "great">>
The evening turns soft in a way you couldn't have bought at four times the price. She kicks her shoes off in the grass, drinks from the bottle, laughs at the heron on the far bank standing there like an unpaid security guard. For an hour the bank of the canal is your whole world and the flat isn't waiting. She walks home pressed against your side, unhurried, and doesn't let go of your arm at the door.
<</switch>>
<<case "bar">>
<<switch $wife.dateQuality>>
<<case "flat">>
The Anchor is dead in the wrong way, three sad drunken regulars and a jukebox nobody's fed. The dartboard's lighting is broken and she beats you twice without seeming to enjoy it. The drinks land, at least. She softens a little by the second one, but the night never quite finds its footing.
<<case "good">>
Two drinks in, she gets competitive, and it's the best thing that's happened to you all week. She talks trash like she used to, lining up her throw with one eye shut, and when she wins she does a small contained victory shimmy she'd deny under oath. She's flushed and loose on the walk home, her hand finding yours without ceremony.
<<case "great">>
She destroys you at darts. Properly, three games straight, and somewhere in the middle of it the years thin out and you're just a guy in a bar watching the best thing in the room run the table. The regulars start backing her. She curtsies to applause. On the way home she's warm and tipsy against you, still narrating her own highlights, and you'd pay the bill twice again right now just for the curtsy.
<</switch>>
<<case "cinema">>
<<switch $wife.dateQuality>>
<<case "flat">>
The film is bad in the boring way rather than the fun way, and the couple behind you conduct their entire relationship at speaking volume. She checks the time twice. On the bus home you both try to build a conversation out of it and the pieces don't quite fit. Still, it was an evening out. The flat looks slightly smaller when you get back, which is to say slightly better.
<<case "good">>
The film is decent and the dark does what the dark does. Somewhere in the second act her head finds your shoulder and stays, and you stop following the plot entirely. Afterward she relitigates the ending all the way to the bus stop, gesturing with the empty popcorn bag, and you take the losing side just to keep her going.
<<case "great">>
You laugh at the same wrong moments, the two of you setting each other off in the dark like teenagers until someone shushes you, which makes it worse. She quotes the worst line in the foyer, doing the actor's face, and you have to stop walking to laugh. The whole bus ride home is the two of you finishing each other's stories. You'd forgotten you were good at this. So had she, by the look of her.
<</switch>>
<<case "restaurant">>
<<switch $wife.dateQuality>>
<<case "flat">>
The room is lovely and the two of you are stiff in it, like guests at a couple of strangers' anniversary. The talk keeps drifting to logistics, the boy, the week, and twice you catch yourself doing the math on the menu and once she catches you doing it. The food is good. The bill lands like a verdict. She thanks you on the way out, and means it, mostly.
<<case "good">>
It takes a glass of wine for both of you to remember how to sit in a place like this, and then it comes back. Candlelight, food neither of you had to cook, no dishes waiting. She talks about something that isn't money or the boy for the first time in months, an idea she's been carrying around, and you listen the way you used to. The walk to the bus is slow on purpose.
<<case "great">>
She came downstairs in the green dress and you forgot what you were going to say, and she clocked it, and that set the tone for the night. Across the candlelight, two glasses in, telling a story with her hands, she is unmistakably the woman from twelve years ago, and from the way she's looking at you, you're apparently visible in there somewhere too. The bill arrives and for once you don't even read it. Worth it. All of it.
<</switch>>
<</switch>>
<br><br>
<<switch $wife.dateQuality>>
<<case "flat">>
<span class="warning">The night never quite caught, but it wasn't nothing.</span>
<<case "good">>
<span class="good">A good night out. It mattered.</span>
<<case "great">>
<span class="good">A night like the old days. She hasn't looked at you like this in years.</span>
<</switch>>
<br><br>
/* She heads to the bedroom when you get back */
<<set $wife.location = "bedroom">>
<<if $wife.dateQuality == "great" and not $wife.intimacyToday and $gameDay >= $intimacyUnlockDay>>
<<link "Pull her close before the night ends.">>
<<set $wife.intimacyToday = true>>
<<set $return = "Bedroom">>
<<goto "Wife Physical">>
<</link>>
<br>
<</if>>
<<link "Head home and call it a night." "Bedroom">><</link>><h2>Morning</h2>
You wake to the overhead light already on and the sound of her breathing hard, and you know before your eyes are open that she knows.
<br><br>
$wife.name is standing over your side of the bed. She has something balled in her fist, and she throws it at you and misses. You don't see what it was, but can only guess. Condom wrapper? Another girl's phone number? Who knows...
<br>
<div class="char-scene">
<img @src="either('images/characters/w/w_angry1.jpeg', 'images/characters/w/w_angry2.jpeg')" class="char-img">
</div>
<<speech "Wife" $wife.name>>
Don't. Don't you dare lie there and pretend you're still half asleep. I was doing your laundry. Yours. And I found that shit in your pocket.
<</speech>>
<<speech "You" $name>>
Wait. Wait, I can explain, just let me...
<</speech>>
<<speech "Wife" $wife.name>>
Explain? Go on then. I would fucking love to hear which version of this you think I'm stupid enough to swallow.
<</speech>>
<br>
She's louder now, past caring who hears it through the walls.
<br><br>
<<speech "Wife" $wife.name>>
I gave up everything for you. The auditions, the callbacks, the one thing that was ever mine, I let all of it go to trail around after you while you burned through our savings and our house and called it a vision. And I stayed. After every bit of it, I stayed, because I kept telling myself the man I married was still in there somewhere under the gut and the self-pity.
<</speech>>
<<speech "Wife" $wife.name>>
I cook, I clean, I raise our son on my own most days, I cover the rent you can't, and this is what you do with what's left of us? You absolute piece of shit. Look at me. Was she worth it? Was any of this shit worth it?
<</speech>>
<br>
You open your mouth. Nothing in it is going to help, and some animal part of you knows enough to keep it shut.
<br><br>
<<speech "Wife" $wife.name>>
No. I'm done talking to you. I have to get our son ready, because one of us still has to act like a person in this house.
<</speech>>
<br>
She turns and walks out, and you hear her voice change in the hall, going soft and ordinary for the boy in a way it will not be for you for a long while. You're left in the bed with it sitting on your chest and the day waiting outside the door as if nothing happened.
<br><br>
<<if $wife.relationship < -25>>
<span class="bad">You're not sure there's a way back from this one.</span>
<<else>>
<span class="bad">$wife.name found out. Your relationship has taken a serious hit.</span>
<</if>>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.discoveryToday = false>>
<<set $wife.discoveryResult = 0>>
<</link>><h2>With $wife.name</h2>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $wife.relationship += 1>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $arousal = Math.max($arousal - 3, 0)>>
<<if $sceneLoc == "bathroom">>
<<set _gifs = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _gifs.push("w_bathroom_hj" + _i + ".gif")>>
<</for>>
<<else>>
<<set _gifs = []>>
<<for _i = 1; _i <= 8; _i++>>
<<set _gifs.push("w_hj" + _i + ".gif")>>
<</for>>
<</if>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
<<wifeWarmth 45 75>>
<<switch _warmth>>
<<case 0>>
<<set _lines = [
"She does it quickly and without much in it, her eyes somewhere across the room, the way you deal with a thing that simply needs doing. When it is over she wipes her hand and turns away, and neither of you pretends it was more than that.",
"Her hand moves out of duty more than wanting, brisk and a little detached. She gets you there, but she's already half somewhere else by the time you finish, and she's the first to reach for something to clean up with.",
"It's perfunctory, her touch going through the motions while her mind is plainly elsewhere. She sees it through to the end, then sits back without a word, the distance between you unchanged."
]>>
<<case 1>>
<<set _lines = [
"She settles against you and takes her time, in no real hurry. There is a warmth to it that has been missing for a while, and she lets it sit between you when it is done.",
"She leans in closer than she needs to, her hand unhurried, almost fond. It isn't the old fire, not quite, but there's a give to her tonight, and she stays tucked against you afterward instead of pulling away.",
"There's an ease to her hand you haven't felt in a long time, a willingness in it. She watches your face as much as her own work, and when it's over she rests against your shoulder a moment before moving."
]>>
<<case 2>>
<<set _lines = [
"She works you slow and deliberate, watching your face for every reaction, plainly enjoying the effect she has on you. She kisses you when it is over, unhurried, the old ease alive in her again.",
"She takes her time on purpose, a teasing curl to her mouth, drawing it out because she likes watching what it does to you. When you finish she's grinning, pleased with herself, and she pulls you in for a kiss.",
"There's a playfulness in her hand, the confidence of a woman who knows exactly what she's doing and is enjoying every second of the proof. She kisses you slow afterward, in no hurry to let the moment end."
]>>
<</switch>>
<<= _lines.random()>>
<br><br>
<<link "Continue." $return>><</link>><h2>With $wife.name</h2>
<<wifeReact>>
''What do you do?''
<br>
/* TALK */
<<if !$wife.talkedToday>>
<<link "Talk to her.">>
<<set $wife.talkedToday = true>>
<<moodShift 1>>
<<set $wife.talkTopic = ["kid", "past", "plans", "cheer", "castings", "sofa", "shower", "shape", "restaurant", "boxing", "startup", "affection", "coffee", "reality", "canal", "series", "documentary", "takeout", "neighbor", "dream", "lottery", "music"].random()>>
<<set $wife.lastInteraction = "talked">>
<<goto "Wife Interact">>
<</link>>
<<else>>
//You've already had a moment to chat with her today.//
<</if>>
<br>
/* AFFECTION */
<<if not $wife.affectionToday>>
<<link "Hold her for a moment.">>
<<set $wife.affectionToday = true>>
<<if $wife.mood >= 0>>
<<moodShift 1>>
<<careCredit>>
<<goto "Wife Affection">>
<<else>>
<<set $wife.lastInteraction = "affection_refuse">>
<<goto "Wife Interact">>
<</if>>
<</link>>
<<else>>
//You've already reached for her once today.//
<</if>>
<br>
/* WINE */
<<if $items.wine > 0 and not $wife.wineToday and $gameDay - $wife.lastWineDay >= 3 and $time >= 5 and $wife.relationship >= 5 and $wife.mood >= 0>>
<<link "Open a bottle of wine with her." "Wife Wine">><</link>>
<br>
<<elseif $items.wine > 0 and $wife.wineToday>>
//You've already shared a bottle with her tonight.//
<br>
<<elseif $items.wine > 0 and $gameDay - $wife.lastWineDay < 3 and $time >= 5 and $wife.relationship >= 5 and $wife.mood >= 0>>
//You shared a bottle with her not long ago.//
<br>
<</if>>
/* DATE */
<<if $time == 5 or $time == 6>>
<<if $wife.dateToday>>
/* Already out tonight - nothing shown */
<<elseif $gameDay - $wife.lastDateDay < 3>>
//You took her out recently. The sitter needs notice, and so does she.//
<br>
<<elseif $wife.mood <= -1>>
//She's in no mood to be charmed out the door tonight.//
<br>
<<elseif $energy < 1>>
//You're too worn out to make an evening of it.//
<br>
<<else>>
<<link "Ask her on a date for the evening." "Wife Date">><</link>>
<br>
<</if>>
<</if>>
/* MAKE A MOVE */
<<if !$wife.intimacyToday>>
<<intimacyReady>>
<<if _ready>>
<<link "Make a move on her.">>
<<if $gameDay < $intimacyUnlockDay>>
<<set $wife.intimacyToday = true>>
<<set $wife.lastInteraction = "advance_tooSoon">>
<<goto "Wife Interact">>
<<elseif $wife.cycleOff and not ($wife.relationship >= 50 and $wife.mood >= 1)>>
<<set $wife.intimacyToday = true>>
<<set $wife.lastInteraction = "advance_period">>
<<goto "Wife Interact">>
<<elseif $wife.relationship >= 25 and $wife.mood >= 1>>
<<set $wife.intimacyToday = true>>
<<goto "Wife Physical">>
<<elseif $wife.relationship >= 25>>
<<set $wife.lastInteraction = "advance_cold">>
<<goto "Wife Interact">>
<<elseif $wife.relationship >= 0>>
<<set $wife.lastInteraction = "advance_notyet">>
<<goto "Wife Interact">>
<<else>>
<<set $wife.intimacyToday = true>>
<<moodShift -1>>
<<set $wife.lastInteraction = "advance_fail">>
<<goto "Wife Interact">>
<</if>>
<</link>>
<<else>>
//Too soon. She's not going to want it again this quick.//
<</if>>
<<else>>
//You've reached for her once today. That's enough.//
<</if>>
<br><br>
<<link "Step away." $return>><</link>><h2>With $wife.name</h2>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $wife.relationship += 1>>
<<set $energy = Math.max($energy - 1, 0)>>
<<set $arousal = Math.max($arousal - 4, 0)>>
<<if $sceneLoc == "bathroom">>
<<set _gifs = []>>
<<for _i = 1; _i <= 5; _i++>>
<<set _gifs.push("w_bathroom_bj" + _i + ".gif")>>
<</for>>
<<else>>
<<set _gifs = []>>
<<for _i = 1; _i <= 9; _i++>>
<<set _gifs.push("w_bj" + _i + ".gif")>>
<</for>>
<</if>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
<<wifeWarmth 65 85>>
<<switch _warmth>>
<<case 0>>
<<set _lines = [
"She lowers herself to it more out of obligation than appetite, finishing the task and sitting back without lingering. You get the sense she would rather be almost anywhere else.",
"She goes down to it dutifully, getting it done with a kind of patient efficiency that never quite becomes wanting. When it's over she straightens up and reaches for her glass, the moment closed as quickly as it opened.",
"There's a resignation in the way she takes you in her mouth, seeing it through because she said she would. She's gentle enough, but her mind is clearly elsewhere, and she doesn't linger once you've finished."
]>>
<<case 1>>
<<set _lines = [
"She gives herself to it properly, unhurried, glancing up at you now and then. Whatever reluctance there once was has gone quiet.",
"She takes her time with it, soft and willing, looking up to catch your eye more than once. The reserve that used to be there has eased, and she settles into it like something she's choosing rather than giving.",
"There's a tenderness to the way she works, in no rush, her eyes finding yours through it. She seems to want to be doing this, and she rests her cheek against you a moment when it's done."
]>>
<<case 2>>
<<set _lines = [
"She is eager, taking her time and taking pleasure in it, the way she used to before everything got heavy. She looks up at you like she means it.",
"She's into it, unmistakably, drawing it out because she's enjoying herself as much as you are. She holds your gaze the whole way, a wickedness in her eyes you haven't seen in a long while.",
"There's a hunger in her tonight, the old confidence back in full, and she takes obvious pleasure in every reaction she pulls out of you. When she finally looks up at you, she swallows smiling."
]>>
<</switch>>
<<= _lines.random()>>
<br><br>
<<if $wife.relationship >= 65 and $gameDay >= $intimacyUnlockDay and not $phone.intimacyPicToday>>
<<link "Reach for your phone. She lets you snap a memory.">>
<<set $phone.intimacyPicToday = true>>
<<set _bjPics = []>>
<<for _i = 1; _i <= 5; _i++>>
<<set _bjPics.push("w_phone_bj" + _i + ".jpeg")>>
<</for>>
<<set _img = "images/characters/w/" + _bjPics.random()>>
<<set _cap = "You took this on day " + $gameDay + ".">>
<<galleryAdd _img _cap>>
<<goto $return>>
<</link>>
<br>
<</if>>
<<link "Continue." $return>><</link>><h2>With $wife.name</h2>
/* Snapshot where this encounter is happening. The act links advance time and
the wife schedule relocates her before the scene renders, so the live value
is unreliable inside the scenes. */
<<set $sceneLoc = $wife.location>>
/* Per-room act thresholds. Tier: 1 = HJ, 2 = BJ, 3 = sex.
_sexHere gates whether sex is ever on the table in this room. */
<<switch $wife.location>>
<<case "bedroom">> <<set _bjRel = 50>><<set _sexRel = 70>><<set _sexHere = true>>
<<case "bathroom">> <<set _bjRel = 50>><<set _sexRel = 80>><<set _sexHere = true>>
<<case "livingroom">> <<set _bjRel = 50>><<set _sexRel = 80>><<set _sexHere = true>>
<<case "kitchen">> <<set _bjRel = 55>><<set _sexRel = 80>><<set _sexHere = true>>
<</switch>>
<<set _roomMaxTier = _sexHere ? 3 : 2>>
/* Wine: while she's tipsy she'll go a little further than usual. Discounts the
relationship requirement and relaxes the sex mood gate, and the entry gate in Wife Interact still blocks a
hostile evening. Tune the -8 / the mood drop to taste. */
<<set _sexMoodReq = 2>>
<<if $wife.tipsy>>
<<set _bjRel = Math.max(10, _bjRel - 8)>>
<<set _sexRel = Math.max(50, _sexRel - 8)>>
<<set _sexMoodReq = 1>>
<</if>>
/* Base ceiling. HJ is always on the table, because the entry gate in
Wife Interact already confirmed she's receptive (mood >= 1). */
<<set _maxTier = 1>>
<<if $wife.mood >= 1 and $wife.relationship >= _bjRel>>
<<set _maxTier = 2>>
<</if>>
<<if _sexHere and $wife.mood >= _sexMoodReq and $wife.relationship >= _sexRel>>
<<set _maxTier = 3>>
<</if>>
/* Her cycle: sex is off the table this week, HJ/BJ still fine. */
<<if $wife.cycleOff and _maxTier > 2>>
<<set _maxTier = 2>>
<</if>>
/* Opening beat - she's agreed to something */
<<if $wife.mood >= 2>>
She catches your hand, eyes curious, and waits to see what you have in mind.
<<elseif $wife.mood >= 1>>
She leans into the touch, a small smile pulling at the corner of her mouth.
<<else>>
She doesn't pull away. She waits.
<</if>>
<<if $wife.cycleOff and _sexHere and $wife.relationship >= _sexRel and $wife.mood >= _sexMoodReq>>
<br>//She murmurs that she's on her period, so you'll have to wait a few days to go all the way.//
<<elseif $wife.cycleOff>>
<br>//She's on her period and a bit tender, but she doesn't push you away.//
<</if>>
<br><br>
''What do you do?''
<br>
<<switch $wife.location>>
<<case "bedroom">>
<<link "Take her hand under the covers.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Ask her to use her mouth.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<link "Make love to her.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<br>
<</if>>
<<case "bathroom">>
<<link "Pull her hand to your cock.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Put your hand on her shoulder and ask her down.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<link "Lift her against the wall.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<br>
<</if>>
<<case "livingroom">>
<<link "Slip her hand under the blanket.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Coax her head down to your lap.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<link "Pull her down onto the couch with you.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<br>
<</if>>
<<case "kitchen">>
<<link "Press up behind her and take her hand back.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Handjob">>
<</link>>
<br>
<<if _maxTier >= 2>>
<<link "Back her against the counter and ask her down.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Oral">>
<</link>>
<br>
<</if>>
<<if _maxTier >= 3>>
<<link "Bend her over the counter.">>
<<set $time = Math.min($time + 1, $timeMax)>>
<<goto "Wife Sex">>
<</link>>
<br>
<</if>>
<</switch>>
<br>
<<link "Change your mind." $return>><</link>><h2>With $wife.name</h2>
<<set $wife.lastIntimacyDay = $gameDay>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $arousal = Math.max($arousal - 6, 0)>>
<<set $wife.relationship += 1>>
<<if $sceneLoc == "bathroom">>
<<set _gifs = []>>
<<for _i = 1; _i <= 4; _i++>>
<<set _gifs.push("w_bathroom_h" + _i + ".gif")>>
<</for>>
<<elseif $sceneLoc == "kitchen">>
<<set _gifs = []>>
<<for _i = 1; _i <= 6; _i++>>
<<set _gifs.push("w_kitchen_h" + _i + ".gif")>>
<</for>>
<<else>>
<<set _gifs = []>>
<<for _i = 1; _i <= 16; _i++>>
<<set _gifs.push("w_h" + _i + ".gif")>>
<</for>>
<</if>>
<div class="intro-image">
<img @src="'images/h/w/' + _gifs.random()" width="100%">
</div>
<br>
<<wifeWarmth 80 92>>
<<switch _warmth>>
<<case 0>>
<<set _lines = [
"She lets it happen more than she takes part in it, quiet and a little distant, her eyes somewhere past you. It is not unkind, just far from what it once was, two people going through familiar motions and hoping they still mean something.",
"She moves with you because the motions are familiar, not because she's lost in them. There's no coldness to it, but no fire either, and afterward she settles onto her side of the bed with a quiet that says a lot about whether she liked it or not.",
"It's gentle and a little absent, her body present while the rest of her keeps a careful distance. You finish, and she rests there beside you, kind but unreachable, the gap between you the same as it was."
]>>
<<case 1>>
<<set _lines = [
"It is gentle and a little careful, the two of you still finding the rhythm again after so long apart. It is good, even so, and she stays close when it is over.",
"There's a tenderness to it, both of you relearning the other slowly, without urgency. It isn't perfect and it doesn't need to be, and she keeps herself wrapped against you well after it's done.",
"She gives herself to it warmly, unhurried, the old shyness of two people remembering how this goes. It's good in a quiet way, and she pulls you in as you come, and holds you close to stay tangled up with you a while."
]>>
<<case 2>>
<<set _lines = [
"She pulls you in and moves with you like she has been waiting for it, the old hunger surfacing in her. Afterward she stays wrapped around you, in no hurry to let go.",
"She's all in tonight, meeting you with a want that doesn't hold anything back, her hands and her breath and her eyes all telling you the same thing. Harder. Deeper. More. When it's over she keeps hold of you, grinning into your shoulder.",
"There's a horniness to her that takes you back years, the way she grabs your hips and sets the pace herself, lost in it as much as you are. Afterward she stays draped over you, languid and unhurried and very much present."
]>>
<</switch>>
<<= _lines.random()>>
<br><br>
<<link "Continue." $return>><</link>><h2>Morning</h2>
She's waiting for you when you wake, sitting on the edge of the bed, already dressed. She doesn't look over when you stir. She's been rehearsing this, you can tell, and she means to get through it without losing the thread.
<div class="char-scene">
<img @src="either('images/characters/w/w_angry1.jpeg', 'images/characters/w/w_angry2.jpeg')" class="char-img">
</div>
<<speech "Wife" $wife.name>>
Sit up. Don't talk, just listen, because I've said this to you in my head a hundred times and I need to say it once out loud.
<</speech>>
<<speech "Wife" $wife.name>>
I am almost done. Not angry-done. Done-done. I gave up the one thing that was ever mine to follow you, and I have spent years telling myself it would turn back into something. I don't tell myself that anymore.
<</speech>>
<<speech "Wife" $wife.name>>
So this is the last of it. The last of my patience, the last of the benefit of the doubt. Give me a reason. A real one. Because if this is still what it is a while from now, I'm taking our son and I'm going, and you will not talk me out of it.
<</speech>>
She holds your eye a moment longer, then gets up and goes to get your son ready, and her voice through the wall is soft and ordinary for him, the way it used to be for you.
<br><br>
<span class="bad">$wife.name has reached the end of her patience. Let things fall further and she will leave.</span>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.ultimatumToday = false>>
<</link>><h2>With $wife.name</h2>
<<set $items.wine -= 1>>
<<set $wife.wineToday = true>>
<<set $wife.lastWineDay = $gameDay>>
<<set $wife.tipsy = true>>
<<moodShift 1 1>>
<div class="intro-image">
<img @src="either('images/characters/w/w_wine1.jpeg', 'images/characters/w/w_wine2.jpeg', 'images/characters/w/w_wine3.jpeg')" width="100%">
</div>
<<if $wife.relationship >= 40>>
You pour two glasses and she's smiling before you've even handed hers over. For an hour the years seem to thin out. She tells a story you've heard a dozen times and you let her, because she tells it well and because watching her tell it is the whole point. By the bottom of the bottle she's leaning into you, warm and unhurried, in no rush to be anywhere but here.
<<elseif $wife.relationship >= 25>>
You pour two glasses and she shifts to make room, tucking her feet up under her. The talk comes easy tonight, looping back through old jokes and half-finished stories. Somewhere in the second glass her hand ends up on your knee and stays there, and she looks at you the way she used to, before there was always something she was bracing for.
<<else>>
You pour two glasses and sit down beside her. She takes hers with a small, surprised look, like she'd half forgotten this was a thing the two of you used to do. The first glass goes down quiet. By the second she's turned toward you instead of the room, something in her shoulders finally letting go, and she laughs at something you say, properly, like she's a little annoyed at herself for it.
<</if>>
<br><br>
<<if not $wife.intimacyToday and $gameDay >= $intimacyUnlockDay>>
<<link "Make a move on her.">>
<<set $wife.intimacyToday = true>>
<<goto "Wife Physical">>
<</link>>
<br>
<</if>>
<<link "Let the evening be what it is." $return>><</link>><h2>Morning</h2>
She's up before you, and she's waiting. Not pacing, not loud. Just sitting at the edge of the bed with her arms crossed, looking at you in a way that's worse than shouting.
<div class="char-scene">
<img src="images/characters/w/w_worry1.jpeg" class="char-img">
</div>
<<speech "Wife" $wife.name>>
You came in late again. I could smell it on you from across the room. And don't think I haven't seen the state of your hands.
<</speech>>
<<speech "You" $name>>
It's nothing. I'm handling it.
<</speech>>
<<speech "Wife" $wife.name>>
You think this is handling it? The drinking and whatever it is you're doing to end up looking like that. I've watched you go down a hole once already. I held this family together at the bottom of it. I cannot do it twice.
<</speech>>
<<speech "Wife" $wife.name>>
I'm not asking you to be a saint. I'm asking you not to throw yourself away in front of me and our son. Because he sees more than you think, and so do I.
<</speech>>
She holds your eye a moment longer, then gets up to start the boy's morning, leaving the weight of it sitting on you.
<br><br>
<span class="warning">$wife.name is worried about the way you're living and it's straining your relationship.</span>
<br><br>
<<link "Get up." "Bedroom">>
<<set $wife.worryScoldToday = false>>
<<set $wife.worryResult = 0>>
<</link>><div class="phone">
<div class="phone-status"><span><<timeofday>></span><span>▮▮▮ 87%</span></div>
<div class="phone-header"><div class="ph-name">Services</div></div>
<div class="phone-screen">
<div class="phone-note">A local outfit that handles the cleaning, so the flat stays in order without you or $wife.name having to keep on top of it.</div>
<br>
<<if $maid.active>>
<div class="phone-note"><span class="good">Cleaning service active.</span> $<<print $maid.cost>> a week, billed weekly. The place stays tidy on its own.</div>
<div class="phone-actions">
<<link "Cancel the service" "Phone Services">>
<<set $maid.active = false>>
<</link>>
</div>
<<else>>
<div class="phone-note">A cleaner twice a week, $<<print $maid.cost>> a week. The chores stop being your problem, and the house stays clean enough that $wife.name has one less thing to hold against you.</div>
<<if $money >= $maid.cost>>
<div class="phone-actions">
<<link `"Hire the cleaning service ($" + $maid.cost + ")"` "Phone Services">>
<<set $money -= $maid.cost>>
<<set $maid.active = true>>
<<set $maid.lastBilled = $gameDay>>
<<set $chores.bedroom = true>>
<<set $chores.kitchen = true>>
<<set $chores.livingroom = true>>
<<set $wife.choreToday = true>>
<</link>>
</div>
<<else>>
<div class="phone-note">//You can't cover the first week ($<<print $maid.cost>>) right now.//</div>
<</if>>
<</if>>
</div>
<div class="phone-foot"><<link "Back" "Phone">><</link>></div>
</div><h2>With $wife.name</h2>
<div class="intro-image wide">
<img @src="either('images/characters/w/w_affection1.jpeg', 'images/characters/w/w_affection2.jpeg', 'images/characters/w/w_affection3.jpeg', 'images/characters/w/w_affection4.jpeg')" width="100%">
</div>
<br>
<<if $wife.relationship >= 50>>
<<set _lines = [
"You pull her in and she comes easily, folding against your chest like it's the most natural thing in the world. Her arms go round you and stay, and for a while neither of you says anything, because nothing needs saying. You can feel her breathing slow against you.",
"She lets you draw her close and tucks her head under your chin, one hand flat against your back. The day goes quiet around the two of you. It's the kind of closeness you'd half forgotten you were allowed, and she holds on a beat longer than you expect.",
"You wrap her up and she melts into it, no hesitation, no bracing. Her fingers curl into your shirt. You stand there together in the small warm silence of it, and you feel something in your chest unknot that you hadn't noticed was tight."
]>>
<<elseif $wife.relationship >= 25>>
<<set _lines = [
"You reach for her and she comes, after the smallest pause, settling into your arms. It isn't the easy thing it once was, not quite, but she stays, her cheek against your shoulder, and the staying is the point.",
"She lets you hold her. Her arms come up around you, a little careful, like she's relearning the shape of it. But she doesn't pull back, and after a moment you feel her relax by a degree against you.",
"You draw her in and she allows it, resting against you with a quiet sigh. There's still a thin distance in it, but it's smaller than it was, and she doesn't seem in any hurry to step out of your arms."
]>>
<<else>>
<<set _lines = [
"You reach for her and she stiffens for a second before letting you hold her, stiff and unsure, her hands resting lightly at your sides. It isn't much. But she doesn't push you away, and for now that's its own small thing.",
"She lets you pull her into a loose embrace, more tolerated than returned. Her body stays a little guarded against yours. Still, she stays put for the length of it, and that's not nothing, the way things have been.",
"You hold her, and she permits it, her arms slow to rise and slower to settle. There's a wariness she can't quite put down. But she stays in the circle of your arms a moment, and lets the moment be what it is."
]>>
<</if>>
<<= _lines.random()>>
<br><br>
<<if $wife.relationship >= 50>>
<<set _say = [
"We don't do this enough anymore. I missed it.",
"Mm. Stay here a second. Just like this.",
"I needed that. More than I'd have admitted, if you'd asked."
]>>
<<elseif $wife.relationship >= 25>>
<<set _say = [
"...That's nice. It's been a while since you just held me.",
"Okay. Okay, that's... yeah. I'll take that.",
"Don't make a thing of it. But thank you."
]>>
<<else>>
<<set _say = [
"...Alright. That's enough for now.",
"I don't know what's gotten into you. But it's not the worst thing.",
"Hm. Well. Don't let it go to your head."
]>>
<</if>>
<<speech "Wife" $wife.name>>
<<= _say.random()>>
<</speech>>
<br>
<<link "Step back." "Wife Interact">><</link>><h2>Out with $wife.name</h2>
/* Quality roll, same formula as the other dates. */
<<set _score = random(1, 100) + ($wife.mood * 10) + Math.floor($wife.relationship / 4) + ($fitnessTier * 3)>>
<<if _score >= 85>>
<<set $wife.dateQuality = "great">>
<<elseif _score >= 45>>
<<set $wife.dateQuality = "good">>
<<else>>
<<set $wife.dateQuality = "flat">>
<</if>>
<<set _gain = 3>>
<<switch $wife.dateQuality>>
<<case "flat">>
<<set $wife.relationship += 1>>
<<case "good">>
<<set $wife.relationship += _gain>>
<<moodShift 1>>
<<case "great">>
<<set $wife.relationship += _gain + 1>>
<<set $wife.mood = 3>>
<</switch>>
<div class="lingerie-row">
<img src="images/dates/date_shop1.jpeg">
<img src="images/dates/date_shop2.jpeg">
<img src="images/dates/date_shop3.jpeg">
</div>
<br>
<<switch $wife.dateQuality>>
<<case "flat">>
<<set _lines = [
"The shop is brighter and pricier than either of you expected, and for the first few minutes she's self-conscious about being in there at all, holding sets up against herself and pulling faces. But she warms to it, ducking behind the curtain and calling out for your verdict on each one. You like all three and tell her so, and she rolls her eyes at you but she's pleased. She picks the one she keeps coming back to, you pay, and you grab a coffee on the walk home. //\"This was a good idea,\"// she admits, like it costs her something to say.",
"She's a little stiff about it at first, muttering that you're both going to walk out of here broke. Still, she tries on the three she likes and steps out for each, asking what you think with her arms half-crossed. You tell her honestly that they all work, and a bit of the wariness goes out of her. You buy her favorite and split a coffee after, and on the bus home she's quiet but her shoulder stays against yours."
]>>
<<case "good">>
<<set _lines = [
"She takes to it faster than you'd have guessed, disappearing behind the curtain and reappearing in each new set with a little turn in the mirror, asking //\"this one, or the other one?\"// and not really waiting for your answer. You tell her, honestly, that you can't choose, and she calls you useless and means the opposite. She settles on the one she likes best, you pay without flinching at the price, and you split a coffee on the way back with her thigh warm against yours in the window seat.",
"It's easy in a way these afternoons usually aren't. She models each set with a running commentary, narrating her own fashion show, and catches you watching her in the fitting-room mirror more than once. //\"Eyes up here,\"// she says, not meaning it. She picks her favorite, you buy it, and the coffee afterward turns into a long, unhurried sit where neither of you is in a rush to get home."
]>>
<<case "great">>
<<set _lines = [
"It turns into the best afternoon the two of you have had in longer than you can remember. She models each set with a showmanship she'd forgotten she had, posing in the mirror, watching your face in the glass and plainly enjoying what she finds there. //\"You're enjoying this far too much,\"// she says, delighted. She can't choose, so you tell her to get the one that makes her feel the way she looks right now. She does. The coffee after stretches into an hour of the old, easy flirting you thought you'd both used up years ago.",
"She lights up the moment she realizes you actually mean it, that this is the whole date and not a chore on the way to something else. She tries on far more than three, parading each one out for you, laughing, twirling, biting back a grin every time she catches your expression. //\"Keep looking at me like that and we're not making it home,\"// she murmurs by the mirror. She picks the one that did exactly that to you, you pay gladly, and the walk home is slow and close and full of plans neither of you says out loud."
]>>
<</switch>>
<<= _lines.random()>>
<br><br>
<<switch $wife.dateQuality>>
<<case "flat">>
<span class="warning">A bit awkward in places, but she's glad you did it.</span>
<<case "good">>
<span class="good">A fun afternoon, and she's grateful for the gesture.</span>
<<case "great">>
<span class="good">She hasn't had this much fun with you in years, and she's still glowing on the way home.</span>
<</switch>>
<br><br>
/* Schedule the flirty selfie a few days out. */
<<set $wife.lingerieSelfieDay = $gameDay + random(2, 4)>>
/* She heads to the bedroom when you get back */
<<set $wife.location = "bedroom">>
<<if $wife.dateQuality == "great" and not $wife.intimacyToday and $gameDay >= $intimacyUnlockDay>>
<<link "Pull her close before the night ends.">>
<<set $wife.intimacyToday = true>>
<<set $return = "Bedroom">>
<<goto "Wife Physical">>
<</link>>
<br>
<</if>>
<<link "Head home and call it a night." "Bedroom">><</link>>Your phone buzzes on the kitchen counter. Helion's name on the screen on a Saturday morning is never good.
<div class="chat">
<div class="bubble in">Production's down and the client's climbing the walls. Need you on-site. How soon can you be here?</div>
</div>
<br>
You look up. $wife.name is already in the doorway, the boy's little backpack over one shoulder, and she reads the whole thing off your face before you've said a word. Her arms fold slowly.
<div class="char-scene">
<img @src="either('images/characters/w/w_callout1.jpeg', 'images/characters/w/w_callout2.jpeg')" class="char-img">
</div>
<<speech "Wife" $wife.name>>
I thought we were going out.
<</speech>>
She doesn't say it sharply. That's almost worse. She just waits, the bag still on her shoulder, watching you decide what kind of Saturday this is going to be.
<br><br>
''What do you do?''
<br>
<<link "Take the callout. The money's good and someone will notice." "Helion Callout">>
<<set $job.calloutPending = false>>
<<set $wife.outingResolved = true>>
<<set $wife.outForDay = true>>
<</link>>
<br>
<<link "Stay. You promised, and you're keeping it." "Weekend Outing">>
<<set $job.calloutPending = false>>
<<set $job.performance -= 1>>
<<moodShift 1>>
<</link>><h2>Helion Dynamics</h2>
You leave with $wife.name's disappointment still hanging in the air behind you. She didn't argue. She just went back to getting the boy ready, her voice softening for him the way it wouldn't for you, and the door clicked shut on a Saturday that was supposed to be the three of you.
<br><br>
<<set $job.performance += 2>>
<<set _bonus = 80 + ($job.level * 40)>>
<<set $money += _bonus>>
<<set $energy = Math.max($energy - 2, 0)>>
<<set $time = Math.min($time + 3, $timeMax)>>
<<addWorry 1>>
<<switch $job.level>>
<<case 1>>
The floor is dead, half the lights off, and the crisis turns out to be exactly the kind of unglamorous mess that rolls downhill to whoever answers the phone. You spend hours babysitting a rollback for a client whose name you're still not allowed to know, running the same checks over and over while a senior on a call somewhere takes the credit for the fix. It's dull, and it's your Saturday, and you'd rather be pushing a swing. But the overtime is real money, and when you finally clock out a manager you barely recognize claps you on the shoulder and says he'll remember you came in. Maybe he will.
<<case 2>>
You're one of three who got the call, and the other two are visibly furious about it, which somehow makes it easier to be the one who stays calm. The fix isn't complicated once you find it, buried in someone else's undocumented shortcut, but finding it eats the whole afternoon. Nobody thanks you in a way that means anything. Still, the extra pay lands in your account before you've left the building, and you catch your name in a thread going up to people you've never met. That's worth something on a ladder like this one.
<<case 3>>
They call you because the quieter work broke, and the quieter work isn't the kind you can hand to just anyone. You spend the day up on the floor your card now reaches, undoing a problem for a client with a name you wish you didn't know, and the whole time a small clear voice reminds you it's Saturday and your son is at a park without you. You fix it. You're good at it. The money is better than good, and the right people see that you were the one who came in. You tell yourself that's why you did it, on the drive home, and almost believe it.
<<case 4>>
A crisis at this level means the client is important enough that someone senior has to be seen putting out the fire, and today that someone is you. You don't touch much code. You steer, you reassure, you make the calls that let the people below you do the actual work, and by evening it's contained and billable and yours. The bonus is the kind that used to feel like a lot of money, back before it stopped meaning anything. On the way out you think about the park you didn't go to, and how easily you talked yourself out of it, and how that's starting to be the easy part.
<<default>>
The building expects you when it matters, and today it mattered. You handle it the way you handle everything up here now, at a remove, through other people, and it's done by evening and the number attached to it is large. Somewhere across town the afternoon happened without you. You made good money. The people who decide these things noticed. You keep telling yourself that's the trade, and mostly you don't examine it too closely.
<</switch>>
<br><br>
<span class="good">Overtime: $<<print _bonus>>. Work performance improved.</span>
<br>
<span class="warning">$wife.name spent the day out with your son. Without you.</span>
<br><br>
<<link "Head home." "Living Room">><</link>>